我是Oracle和DBMS的新手,我有两个表CAR_OWNER和CAR。我正在尝试使用Cursor和loop来获取每个人拥有的汽车数量,但是我应该通过Join进行吗?还是有特定功能可以做到这一点? 下面是我的代码:
declare
v_PNR CAR_OWNER.PNR%TYPE;
i NUMBER;
cursor c_custcell is
select First_name, Last_Name, PNR from CAR_OWNER;
begin
i:=1;
if not (c_custcell%isopen) then
open c_custcell;
end if;
loop
i := i +1;
exit when i = 11;
fetch c_custcell into v_First_name, v_Last_name, v_PNR;
exit when c_custcell%notfound;
dbms_output.put_line(''||initcap (v_First_name)||', '||initcap (v_Last_name)||', '||v_PNR||', '||i||',');
end loop;
end;
/
答案 0 :(得分:0)
按所有者和count
分组会更容易:
SELECT INITCAP(first_name), INITCAP(last_name), COUNT(*)
FROM car_owners
GROUP BY first_name, last_name
答案 1 :(得分:0)
尽管您实际上并不需要PL / SQL,但是我想您出于研究目的选择了这种方法。
您没有共享表的描述,所以我会(部分)猜测。无论如何,我希望你能明白。
我不是在使用游标FOR循环,而是使用游标FOR循环来代替显式声明游标并处理所有内容(声明它,打开,获取,小心退出循环,关闭游标),对我来说,大部分肮脏工作。
begin
-- Select all owners. I presume that there must be some kind of the "ID"
-- column which is used to enforce referential integrity constraint between
-- cars and their owners. I'll use that "ID" column later, while selecting
-- number of cars per each person
for cur_r in (select o.first_name, o.last_name, o.owner_id
from car_owner o
)
loop
-- count number of cars for that OWNER_ID
select count(*)
into l_cnt
from car c
where c.owner_id = cur_r.owner_id;
dbms_output.put_line(cur_r.first_name||' '||cur_r.last_name ||
' owns ' || l_cnt || ' cars');
end loop;
end;
答案 2 :(得分:0)
我不认为您应该为此使用光标,也不认为您需要一个。这样的事情应该可以解决问题-但请注意,我对您的表做了一些假设,因此您需要调整查询以满足您的需求:
SELECT co.First_name, co.Last_name, COUNT(c.ID) as Number_of_cars
FROM CAR_OWNER co
JOIN CAR c ON co.ID = c.OWNER_ID
GROUP BY co.First_name, co.Last_name
这将使您拥有至少一辆汽车的所有所有者;如果您想让所有车主拥有0辆车,那么请将JOIN更改为LEFT JOIN。