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

2-2-8 exists述語の引数に集合演算

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            1
   3            1
   4            1
   5            0
   6            1
   7            0
   8            1
   9            1
  10            1


データ作成スクリプト

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
       union all 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)
       or exists(select 1 from Table3 b where b.Col1=a.Col1)
     then 1 else 0 end as IsReference
from Table1 a
order by Col1;


解説

exists述語の引数に集合演算を使うと、
集合演算の結果が空集合ならFalseを返し、空集合でなければTrueを返します。