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

使用批量收集获取具有不同id的行-Oracle,oracle,plsql,greatest-n-per-group,Oracle,Plsql,Greatest N Per Group,我想使用批量收集获取具有不同成员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

我想使用批量收集获取具有不同成员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表有一个名为member_id的列,我想在members_bc中得到的是具有不同member_id的行

例如,如果我的t2表有如下内容:

我只想批量收集

不管是哪一个。但是memberid在members\u bc中必须是唯一的


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

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

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

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

select name,  
       surname, 
       min(account) as account,        --> this
       member_id
from ...
group by name, surname, member_id      --> and this
使用ROW_NUMBER分析函数为每一行提供一个每个成员id的编号,然后过滤以仅获取第一行

声明 类型成员是表2%行类型的表; 成员(卑诗省成员); 开始 选择t2.姓名,t2.姓氏,t2.帐户,t2.成员id 批量收集到成员中 从…起 选择t2.*, 按成员划分的分区上的行数 来自表2 t2 t2 其中rn=1; 因为我在1。。成员数循环 DBMS|u OUTPUT.PUT_LINE members_bci.member_id | |“”| members_bci.name; 端环; 终止 / 产出:

dbfiddle

使用行数分析函数为每一行的每个成员id指定一个数字,然后过滤以仅获取第一行

声明 类型成员是表2%行类型的表; 成员(卑诗省成员); 开始 选择t2.姓名,t2.姓氏,t2.帐户,t2.成员id 批量收集到成员中 从…起 选择t2.*, 按成员划分的分区上的行数 来自表2 t2 t2 其中rn=1; 因为我在1。。成员数循环 DBMS|u OUTPUT.PUT_LINE members_bci.member_id | |“”| members_bci.name; 端环; 终止 / 产出:


dbfiddle

通过为select创建光标,然后创建光标的%行类型,可以避免select*而只需输入所需的列。 使用@MT0 answer作为基线模板

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;

通过为select创建光标,然后创建光标的%行类型,可以避免select*,只需输入所需的列。 使用@MT0 answer作为基线模板

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;

在这个答案中,批量收集如何适合?在我的表中,我有很多列,所以我不想在select语句之后逐个编写它们。我的问题是,我找不到一个能与大容量收集到语句一起工作的解决方案。在生产系统中使用select*很可能是错误的。为了快速/测试/开发目的-好的,我们都这么做。但对于真正的东西,不用了,谢谢。顺便说一句,如果你开始打字,你已经完成了很多列。不,我不是在开玩笑,也不是在取笑你,只是想告诉你做什么才是正确的。当你使用%ROWTYPE数据类型时,SELECT*并没有错,因为你希望所有列的顺序完全正确,如果表结构没有改变,那么你仍然希望所有列的顺序完全正确您只需要重新编译过程/包就可以让PL/SQL正常工作了。在这个答案中,批量是如何收集的?在我的表中,我有很多列,所以我不想在select语句之后逐个编写它们。我的问题是,我找不到一个能与大容量收集到语句一起工作的解决方案。在生产系统中使用select*很可能是错误的。为了快速/测试/开发目的-好的,我们都这么做。但对于真正的东西,不用了,谢谢。顺便说一句,如果你开始打字,你已经完成了很多列。不,我不是在开玩笑,也不是在取笑你,只是想告诉你做什么才是正确的。当你使用%ROWTYPE数据类型时,SELECT*并没有错,因为你希望所有列的顺序完全正确,如果表结构没有改变,那么你仍然希望所有列的顺序完全正确您只需要重新编译过程/包就可以使PL/SQL正常工作。 123 john 234 mary
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;