トップページに戻る    次の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)
を使ってます。