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

9-10 共通集合が空集合かチェック

SQLパズル

工場テーブル    操縦士テーブル
飛行機名        操縦士ID   操縦可能機
--------        --------  ----------
ジャビィ               1    ジャビィ
ハンター               2    ファルコ
ファルコ               3    ハンター
                       4    ジャビィ
                       4    ファルコ
                       5    ジャビィ
                       5    ハンター
                       5    ファルコ
                       5    ペリカン
                       6    ハンター
                       6    ペリカン
                       7    ジャビィ
                       7    ファルコ
                       7    ペリカン
                       8    ジャビィ
                       8    ハンター
                       8    ファルコ

操縦士ID=6の人の操縦可能機の中で、工場にある飛行機(この場合は、ハンター)
を操縦可能な操縦士IDと、操縦可能機を出力する(ただし、操縦士ID=6は出力しない)

出力結果
操縦士ID   飛行機名
--------  ----------
       3    ハンター
       5    ジャビィ
       5    ハンター
       5    ファルコ
       5    ペリカン
       8    ジャビィ
       8    ハンター
       8    ファルコ


データ作成スクリプト

前のSQLパズルと同じ


SQL

select 操縦士ID,操縦可能機 as 飛行機名
from 操縦士 a
where exists(select b.操縦可能機 from 操縦士 b
              where b.操縦士ID=a.操縦士ID
             intersect
             select b.操縦可能機 from 操縦士 b
              where b.操縦士ID=6
             intersect
             select b.飛行機名 from 工場 b)
  and 操縦士ID != 6;


解説

intersect演算子で共通集合を求めて、
exists述語で空集合かチェックしてます