Курсор, чтобы получить количество автомобилей, которыми владеет каждый человек - PullRequest
0 голосов
/ 03 ноября 2018

Я новичок в Oracle и СУБД, и у меня есть две таблицы CAR_OWNER и CAR. Я пытаюсь определить количество автомобилей, которыми владеет каждый человек, с помощью курсора и цикла, но я должен сделать это с помощью 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;
/

Ответы [ 3 ]

0 голосов
/ 03 ноября 2018

Хотя для этого вам не нужен 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;
0 голосов
/ 03 ноября 2018

Я не думаю, что вы должны использовать курсор для этого, и при этом я не думаю, что он вам нужен. Нечто подобное должно сработать, но, пожалуйста, обратите внимание, что я делаю некоторые предположения о ваших таблицах, поэтому вам нужно будет скорректировать запрос в соответствии с вашими потребностями:

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.

0 голосов
/ 03 ноября 2018

Было бы проще сгруппировать по владельцу и count:

SELECT   INITCAP(first_name), INITCAP(last_name), COUNT(*)
FROM     car_owners
GROUP BY first_name, last_name
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...