トップページに戻る    次のSQLパズルへ    前のSQLパズルへ

9-26 存在しない組み合わせを出力

SQLパズル

InOutTable
InData  OutData
------  -------
InAAAA  OutBBB
InAAAA  OutCCC
InBBBB  OutDDD
InCCCC  OutAAA
InCCCC  OutDDD
InDDDD  OutAAA
InDDDD  OutBBB

InOutTableの、InDataとOutDataの全ての組み合わせの中で
InOutTableに存在しない組み合わせを出力する

出力結果
InData  OutData
------  -------
InAAAA  OutAAA
InAAAA  OutDDD
InBBBB  OutAAA
InBBBB  OutBBB
InBBBB  OutCCC
InCCCC  OutBBB
InCCCC  OutCCC
InDDDD  OutCCC
InDDDD  OutDDD

SQLパズル(日本語版)のパズル25 [データフローダイアグラム] を参考にさせていただきました
SQLパズル 第2版のパズル26 [DFD] を参考にさせていただきました


データ作成スクリプト

create table InOutTable(
InData  varchar2(6) not null,
OutData varchar2(6) not null);

insert into InOutTable values('InAAAA','OutBBB');
insert into InOutTable values('InAAAA','OutCCC');
insert into InOutTable values('InBBBB','OutDDD');
insert into InOutTable values('InCCCC','OutAAA');
insert into InOutTable values('InCCCC','OutDDD');
insert into InOutTable values('InDDDD','OutAAA');
insert into InOutTable values('InDDDD','OutBBB');
commit;


SQL

--■■■分析関数を使う方法■■■
select distinct InData,OutData
from (select a.InData,b.OutData,
      count(distinct a.OutData) over(partition by a.InData) as 結合可能数,
      count(distinct a.OutData) over(partition by a.InData,b.OutData) as 結合数
        from InOutTable a,InOutTable b
      where a.OutData != b.OutData)
where 結合可能数 = 結合数
order by InData,OutData;

--■■■not inを使う方法■■■
select distinct a.InData,b.OutData
  from InOutTable a,InOutTable b
 where a.OutData != b.OutData
   and (a.InData,b.OutData)
   not in (select c.InData,c.OutData
             from InOutTable c)
order by InData,OutData;

--■■■not existsを使う方法■■■
select distinct a.InData,b.OutData
  from InOutTable a,InOutTable b
 where a.OutData != b.OutData
   and not exists(select 1 from InOutTable c
                   where c.InData  = a.InData
                     and c.OutData = b.OutData)
order by InData,OutData;

--■■■minusを使う方法■■■
select a.InData,b.OutData
  from InOutTable a,InOutTable b
 where a.OutData != b.OutData
minus select c.InData,c.OutData from InOutTable c
order by InData,OutData;


解説

クロスジョインで組み合わせを列挙してます