トップページに戻る
次のSQLパズルへ
前のSQLパズルへ
9-58 集合が等しい組み合わせを求める(重複許可版)
SQLパズル
CodeValテーブル
Code Val
---- ---
AAAA 1
AAAA 1
AAAA 1
AAAA 2
BBBB 1
BBBB 1
CCCC 1
CCCC 1
CCCC 2
CCCC 2
DDDD 1
DDDD 1
DDDD 1
DDDD 2
EEEE 1
EEEE 2
EEEE 2
EEEE 2
Codeごとの、Val1とVal2の集合の組み合わせで、
集合が等しい組み合わせを、
以下の形式で出力する。
CodeValテーブルに重複行は存在するものとする。
出力結果
S1 S2
---- ----
AAAA DDDD
データ作成スクリプト
create table CodeVal as
select 'AAAA' as Code,1 as Val from dual
union all select 'AAAA',1 from dual
union all select 'AAAA',1 from dual
union all select 'AAAA',2 from dual
union all select 'BBBB',1 from dual
union all select 'BBBB',1 from dual
union all select 'CCCC',1 from dual
union all select 'CCCC',1 from dual
union all select 'CCCC',2 from dual
union all select 'CCCC',2 from dual
union all select 'DDDD',1 from dual
union all select 'DDDD',1 from dual
union all select 'DDDD',1 from dual
union all select 'DDDD',2 from dual
union all select 'EEEE',1 from dual
union all select 'EEEE',2 from dual
union all select 'EEEE',2 from dual
union all select 'EEEE',2 from dual;
SQL
select distinct a.Code as S1,b.Code as S1
from CodeVal a,CodeVal b
where a.Code < b.Code
and not exists(select c.Val,row_number() over(partition by c.Val order by 1)
from CodeVal c
where c.Code = a.Code
minus
select d.Val,row_number() over(partition by d.Val order by 1)
from CodeVal d
where d.Code = b.Code)
and not exists(select c.Val,row_number() over(partition by c.Val order by 1)
from CodeVal c
where c.Code = b.Code
minus
select d.Val,row_number() over(partition by d.Val order by 1)
from CodeVal d
where d.Code = a.Code);
解説
集合の一致
ふたつの集合AとBに対して、AとBとが等しいとは、
A⊂B と B⊂A が両方とも成り立つときをいう。
またこのときA=Bと書く。
という論理を使ってます。