使用批量收集获取具有不同 ID 的行 - Oracle

Getting rows that are having distinct id with bulk collect - Oracle

我想使用批量收集获取具有不同成员 ID 的记录。 我的查询如下:

  ...
    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 table 有一个名为 member_id 的列,我想进入 members_bc 的行具有不同的 member_id.

例如,如果我的 t2 table 有这样的东西:

  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_bc.

中必须是唯一的

我怎样才能做到这一点?谢谢。

一个简单的选择是使用聚合,例如

select name,  
       surname, 
       min(account) as account,        --> this
       member_id
from ...
group by name, surname, member_id      --> and this

使用 ROW_NUMBER() 分析函数为每行指定一个数字 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

db<>fiddle here

您可以避免 "select *" 并通过为您的 select 创建游标然后创建游标的 %rowtype 来输入所需的列。 使用@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;