光标获取每个人拥有的汽车数量



我是Oracle和DBMS的新手,我有两个表CAR_OWNER和CAR。我试图通过使用Cursor和循环来获得每个人拥有的汽车数量,但我应该通过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;
/

尽管您并不真的需要PL/SQL来完成这项工作,但我认为您选择这种方法是出于研究目的。

你没有分享表的描述,所以我(部分(猜测。不管怎样,我希望你会明白的。

我使用游标FOR循环,而不是显式声明游标并处理所有(声明它、打开、获取、注意退出循环、关闭游标(,因为Oracle为我做了的大部分工作。

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;

按所有者和count:进行分组会更容易

SELECT   INITCAP(first_name), INITCAP(last_name), COUNT(*)
FROM     car_owners
GROUP BY first_name, last_name

我认为您不应该为此使用光标,也不需要光标。像这样的东西应该可以做到这一点,但请注意,我对你的表做了一些假设,所以你需要调整查询以满足你的需求:

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。

最新更新