業務において、存在しない組み合わせを表示する必要に迫られることはよくあります。
例えば、以下のような表が存在するとしましょう。
この表は、開催されたミーティングの回数とその回の出席者の一覧です。
例えば、1行目は「伊藤さんが第1回目のミーティングに出席した」ことを表しています。
この表から、回ごとの欠席者を出したいという時、どのようにSQLで表現すればよいでしょうか。
例えば、水島さんは第2回のミーティングに参加していません。
こうした回ごとの欠席者の一覧を表示したいのです。
この時、以下のように考えることで、回ごとの欠席者を求めることができます。
・全ての組み合わせから、実際に存在する組み合わせを排除する
図にすると以下のようなイメージです。
これをSQLで表現する場合は、以下のように記述します。
存在しない組み合わせを表示するSQL
-- ①CROSS JOIN + Distictで全ての「meeting」と「person」の組み合わせを求める select distinct p1.meeting, p2.person from p5_shusseki p1 cross join p5_shusseki p2 -- ②そのうち、実際に存在する組み合わせを除外する where not exists ( select 1 from p5_shusseki p3 where p3.meeting = p1.meeting and p3.person = p2.person);