簡體   English   中英

在兩個相似的表層次結構之間匹配一組子記錄

[英]Matching a set of child records between two similar table hierarchies

我有兩個類似的表層次結構:

Owner -> OwnerGroup -> Parent

Owner2 -> OwnerGroup2

我想根據一組值確定Owner2中是否存在完全匹配的Owners。 每個所有者表中大約有一百萬行。 某些OwnerGroup最多包含100個所有者。

因此,基本上,如果有一個OwnerGroup而不包含所有者“ Smith”,“ John”和“ Smith,” Jane”,我想知道完全匹配的OwnerGroup2s的ID。

首次嘗試是為每個所有者生成一個聯接(這需要在應用程序中生成動態sql:

select og.id
from owner_group2 og
-- dynamic bit starts here
join owner2 o1 on
(og.id = o1.og_id) AND
(o1.given_names = 'JOHN' and o1.surname='SMITH')
-- dynamic bit ends here
join owner2 o2 on
(og.id = o2.og_id) AND
(o2.given_names = 'JANE' and o2.surname='SMITH');

直到少數所有者,此方法都可以正常工作,但是當我們必須在組方案中處理100個所有者時,因為此查詢計划意味着存在100個嵌套循環,因此運行將近一分鍾。

我的另一個選擇是在intersect運算符周圍使用某些東西。 例如

select * from ( 
select o.surname, o.given_names
from owner1 o1
join owner_group1 og1 on o1.og_id = og1.id 
where 
og1.parent_id = 1936233
)
intersect
select o.surname, o.given_names
from owner2 o2 
join owner_group2 og2 on og2.id = o2.og_id;

在這種情況下,我也不確定如何吸收owner2.id-並且它仍在4-5秒范圍內運行。

我覺得自己缺少明顯的東西-請隨時提供一些更好的解決方案!

intersect正確的軌道上,您只需要走得更遠。 您需要將其結果重新添加到owner_groups2表中以找到ID。

您可以使用listagg函數將各組轉換為以逗號分隔的名稱列表(注意-需要11g)。 然后,您可以使用這些名稱列表的交集來查找匹配項,並將其加入owner_groups2的列表中。

我在下面創建了一個簡化的示例,其中“ Dave,Jill”是兩個表中都存在的組。

create table grps (id integer, name varchar2(100));
create table grps2 (id integer, name varchar2(100));

insert into grps values (1, 'Dave');
insert into grps values(1, 'Jill');

insert into grps values (2, 'Barry');
insert into grps values(2, 'Jane');

insert into grps2 values(3, 'Dave');
insert into grps2 values(3, 'Jill');

insert into grps2 values(4, 'Barry');

with grp1 as (
 SELECT id, listagg(name, ',') within group (order by name) n 
 FROM grps
 group by id
), grp2 as (
 SELECT id, listagg(name, ',') within group (order by name) n 
 FROM grps2
 group by id
)
SELECT * FROM grp2 
where  n in (
  -- find the duplicates
  select n from grp1 
  intersect
  select n from grp2
);

注意,這仍然需要對owner_groups2進行完整掃描; 我想不出一種可以避免這種情況的方法。 因此,您的查詢可能會保持緩慢。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM