使用批量收集获取具有不同id的行-Oracle
我想使用批量收集获取具有不同成员id的记录。 我的问题如下:使用批量收集获取具有不同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
...
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;