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

2-2-10 共通集合と論理積

SQLパズル

Table1    Table2    Table3
Col1      Col1      Col1
----      ----      ----
   1         2         3
   2         4         6
   3         8         9
   4        10        12
   5                  15
   6                  18
   7
   8
   9
  10

Table1のCol1が、
Table2とTable3の両方から、外部キー経由で参照されていれば1、されてなければ0
を出力する。

Table1、Table2、Table3のプライマリキーは、Col1とする。

出力結果
Col1  IsReference
----  -----------
   1            0
   2            0
   3            0
   4            0
   5            0
   6            1
   7            0
   8            0
   9            0
  10            0


データ作成スクリプト

create table Table1(Col1 number,primary key(Col1));
create table Table2(Col1 number,primary key(Col1));
create table Table3(Col1 number,primary key(Col1));

begin
    for i in 1..10 loop
        insert into Table1(Col1) values(i);
        insert into Table2(Col1) select i from dual where mod(i,2)=0; --2の倍数
        insert into Table3(Col1) select i from dual where mod(i,3)=0; --3の倍数
    end loop;
    commit;
end;
/


SQL

--■■■exists述語の引数に共通集合を使う方法■■■
select Col1,
case when exists(select 1 from Table2 b where b.Col1=a.Col1
       intersect select 1 from Table3 b where b.Col1=a.Col1)
     then 1 else 0 end as IsReference
from Table1 a
order by Col1;

--■■■exists述語の論理積を使う方法■■■
select Col1,
case when exists(select 1 from Table2 b where b.Col1=a.Col1)
      and exists(select 1 from Table3 b where b.Col1=a.Col1)
     then 1 else 0 end as IsReference
from Table1 a
order by Col1;

--■■■集合演算の公式A∩B=A∩¬(A∩¬B)を使って共通集合を求める方法■■■
select Col1,
case when exists(select 1 from(
                     select Col1 from Table2
                     minus (select Col1 from Table2 minus select Col1 from Table3)) b
                  where b.Col1=a.Col1)
     then 1 else 0 end as IsReference
from Table1 a
order by Col1;


解説

exists述語の論理積は、
exists述語の引数に共通集合を使うことで代用できます。