以下のテーブルがある
select * from meetings;
+-----------+--------+
| meeting | person |
+-----------+--------+
| 第1回 | 伊藤 |
| 第1回 | 坂東 |
| 第1回 | 水島 |
| 第2回 | 伊藤 |
| 第2回 | 宮田 |
| 第3回 | 坂東 |
| 第3回 | 宮田 |
| 第3回 | 水島 |
+-----------+--------+
meetingに出席しなかったpersonを取得する。
方法として、全員が解禁したと仮定した場合の集合を作り、
そこから現実に出席した人々を引き算する。
全員が解禁した場合の集合はクロス結合で作れる。
select
distinct
m1.meeting
,m2.person
from
meetings m1
cross join
meetings m2
+-----------+--------+
| meeting | person |
+-----------+--------+
| 第1回 | 伊藤 |
| 第2回 | 伊藤 |
| 第3回 | 伊藤 |
| 第1回 | 坂東 |
| 第2回 | 坂東 |
| 第3回 | 坂東 |
| 第1回 | 水島 |
| 第2回 | 水島 |
| 第3回 | 水島 |
| 第1回 | 宮田 |
| 第2回 | 宮田 |
| 第3回 | 宮田 |
+-----------+--------+
上記から実際の出席者の集合であるmeetingsテーブルに存在しない組み合わせに限定する。
select
distinct
m1.meeting
,m2.person
from
meetings m1
cross join
meetings m2
where
not exists
(
select
*
from
meetings m3
where
m1.meeting = m3.meeting
and m2.person = m3.person
)
order by
m1.meeting
+-----------+--------+
| meeting | person |
+-----------+--------+
| 第1回 | 宮田 |
| 第2回 | 坂東 |
| 第2回 | 水島 |
| 第3回 | 伊藤 |
+-----------+--------+
こちらを参考にさせていただきました。
達人に学ぶSQL徹底指南書 第2版 初級者で終わりたくないあなたへ