トップページに戻る
次のSQLパズルへ
前のSQLパズルへ
7-41 順序無視の重複チェック(各値の重複なし)
SQLパズル
Table741
Col1 Col2 Col3 Col4
---- ---- ---- ----
1 2 3 4
2 1 3 4
5 4 3 2
2 3 4 5
6 7 8 9 ←出力対象
Table741の項目(Col1,Col2,Col3,Col4)の順序を無視して、
他レコードとの重複をチェックし、
重複のないレコードを出力する。
ただし、
同一レコードでCol1,Col2,Col3,Col4の中での値の重複は、ないものとする。
データ作成スクリプト
create table Table741(
Col1 number(1),
Col2 number(1),
Col3 number(1),
Col4 number(1));
insert into Table741 values(1,2,3,4);
insert into Table741 values(2,1,3,4);
insert into Table741 values(5,4,3,2);
insert into Table741 values(2,3,4,5);
insert into Table741 values(6,7,8,9);
commit;
SQL
select Col1,Col2,Col3,Col4
from Table741 a
where not exists(select 1 from Table741 b
where b.RowID != a.RowID
and b.Col1 in(a.Col1,a.Col2,a.Col3,a.Col4)
and b.Col2 in(a.Col1,a.Col2,a.Col3,a.Col4)
and b.Col3 in(a.Col1,a.Col2,a.Col3,a.Col4)
and b.Col4 in(a.Col1,a.Col2,a.Col3,a.Col4)
and a.Col1 in(b.Col1,b.Col2,b.Col3,b.Col4)
and a.Col2 in(b.Col1,b.Col2,b.Col3,b.Col4)
and a.Col3 in(b.Col1,b.Col2,b.Col3,b.Col4)
and a.Col4 in(b.Col1,b.Col2,b.Col3,b.Col4));
解説
数学の集合理論の、
集合Aが集合Bの部分集合で、かつ
集合Bが集合Aの部分集合ならば、
集合Aと集合Bは等しい
(A=B ⇔ A⊂B かつ B⊂A)
を使ってます。