我是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。