トップページに戻る    次の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

9-27 集合の包含関係を調べるのアレンジです


データ作成スクリプト

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と書く。

という論理を使ってます。