使用批量收集获取具有不同 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;
我想使用批量收集获取具有不同成员 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;