Получение строк, имеющих разные идентификаторы, с массовым сбором - Oracle - PullRequest
0 голосов
/ 07 февраля 2020

Я хочу получить записи, которые имеют разные идентификаторы членов, используя массовый сбор. Мой запрос выглядит следующим образом:

  ...
    type members_nt is table of table2%rowtype;
    members_bc      members_nt;
  ...
select t2.* bulk collect
        into members_bc
        from table1 t1
            ,table2 t2
       where t1.isn= t2.isn
         and t1.customer= customer
         and t1.insert_date between ... and ... );

В таблице t2 есть столбец с именем member_id, и то, что я хочу получить в members_b c, - это строки, имеющие отдельный member_id.

Например, если в моей таблице t2 есть что-то вроде этого:

  name  |  surname  | account   | member_id 
  john       alby      abc         123   
  john       alby      def         123 
  mary       hale      lkj         234

Я хочу массово собрать только

name  |  surname  | account   | member_id
john       alby      abc          123
mary       hale      lkj          234

или

name  |  surname  | account   | member_id
john       alby      def          123
mary       hale      lkj          234

Неважно, какой именно. Но memberid должен быть уникальным в members_b c.

Как мне этого добиться? Спасибо.

Ответы [ 3 ]

1 голос
/ 07 февраля 2020

Используйте функцию ROW_NUMBER() analyti c, чтобы присвоить каждой строке номер для member_id, а затем отфильтруйте, чтобы получить только первую строку.

DECLARE
  TYPE members_nt IS TABLE OF table2%ROWTYPE;
  members_bc members_nt;
BEGIN
  SELECT t2.name, t2.surname, t2.account, t2.member_id
  BULK COLLECT INTO members_bc
  FROM  (
    SELECT t2.*,
           ROW_NUMBER() OVER ( PARTITION BY member_id ORDER BY ROWNUM ) AS rn
    FROM   table2 t2
  ) t2
  WHERE  rn = 1;

  FOR i IN 1 .. members_bc.COUNT LOOP
    DBMS_OUTPUT.PUT_LINE( members_bc(i).member_id || ' ' || members_bc(i).name );
  END LOOP;
END;
/

выходные данные:

123 john
234 mary

дБ <> скрипка здесь

1 голос
/ 08 февраля 2020

Вы можете избежать «выбора *» и просто ввести нужные столбцы, создав курсор для вашего выбора, а затем создав тип курсора в%. Использование @ MT0 ответа в качестве базового шаблона.)

declare
  cursor members_cur is 
         select t2.name, t2.surname, t2.account, t2.member_id
           from ( select t2.name, t2.surname, t2.account, t2.member_id
                       , row_number() over ( partition by member_id order by rownum ) as rn
                   from table2 t2
                ) t2
          where rn = 1;

  type members_tt is table of members_cur%rowtype;
  members_bc members_tt;
begin
  open  members_cur; 
  fetch members_cur 
   bulk collect into members_bc;
  close members_cur; 

  for i in 1 .. members_bc.count 
  loop
    dbms_output.put_line(members_bc(i).member_id || ' ' ||members_bc(i).name);
  end loop;
end;
0 голосов
/ 07 февраля 2020

Простой вариант - использовать агрегацию, например

select name,  
       surname, 
       min(account) as account,        --> this
       member_id
from ...
group by name, surname, member_id      --> and this
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...