像這樣的事情
create table t1 (group_id varchar2(20), value varchar2(20));
create table t2 (group_id varchar2(20), value varchar2(20));
insert into t1 values ('A','FOO');
insert into t1 values ('A','BAR');
insert into t1 values ('X','HHH');
insert into t1 values ('X','ZOO');
insert into t2 values ('C','FOO');
insert into t2 values ('C','BAR');
insert into t2 values ('B','ZOO');
select t1.group_id t1_group,t2.group_id t2_group,
--t1.all_val, t2.all_val,
case when t1.all_val = t2.all_val then 'match' else 'no match' end coll_match
from
(select 'T1' tab_id, group_id, collect(value) all_val,
min(value) min_val, max(value) max_val, count(distinct value) cnt_val
from t1 group by group_id) t1
full outer join
(select 'T2' tab_id, group_id, collect(value) all_val,
min(value) min_val, max(value) max_val, count(distinct value) cnt_val
from t2 group by group_id) t2
on t1.min_val = t2.min_val and t1.max_val = t2.max_val and t1.cnt_val = t2.cnt_val
/
我已經做基礎上,minmium,最大和各組不同的值,這將與大型數據集幫助數的初步消除。如果數據集足夠小,則可能不需要它們。
告訴你比賽。你只需要推出一個額外的步驟來找到沒有任何匹配的組
select t1_group
from
(
select t1.group_id t1_group,t2.group_id t2_group,
--t1.all_val, t2.all_val,
case when t1.all_val = t2.all_val then 'match' end coll_match
from
(select 'T1' tab_id, group_id, collect(value) all_val
from t1 group by group_id) t1
cross join
(select 'T2' tab_id, group_id, collect(value) all_val
from t2 group by group_id) t2
)
group by t1_group
having min(coll_match) is null
/
select t2_group
from
(
select t1.group_id t1_group,t2.group_id t2_group,
--t1.all_val, t2.all_val,
case when t1.all_val = t2.all_val then 'match' end coll_match
from
(select 'T1' tab_id, group_id, collect(value) all_val
from t1 group by group_id) t1
cross join
(select 'T2' tab_id, group_id, collect(value) all_val
from t2 group by group_id) t2
)
group by t2_group
having min(coll_match) is null
/
應該輸出什麼?只是一個不同的團體名單?或者差異本身? – 2009-12-03 17:08:22
輸出並不重要,重要的是查詢會看到這些組並將它們作爲組進行比較。 – paweloque 2009-12-03 17:10:12
當您發佈問題時,請向我們展示樣品數據,清楚列出樣品結果並加以標記,以便我們可以輕鬆幫助您。 – JonH 2009-12-03 17:16:49