SELECT *
FROM reservation
WHERE id NOT IN (select reservation_id
FROM reservation_log
WHERE change_type = 'cancel')
または:
SELECT r.*
FROM reservation r
LEFT JOIN reservation_log l ON r.id = l.reservation_id AND l.change_type = 'cancel'
WHERE l.id IS NULL
最初のバージョンの方が直感的ですが、通常、2番目のバージョンの方がパフォーマンスが向上すると思います(結合で使用される列にインデックスがあると仮定します)。
LEFT JOIN
が原因で、2番目のバージョンが機能します 最初のテーブルのすべての行の行を返します。 ON
の場合 条件が成功すると、これらの行には、INNER JOIN
と同様に、2番目のテーブルの列が含まれます。 。条件が失敗すると、返される行にはNULL
が含まれます。 2番目のテーブルのすべての列。 WHERE l.id IS NULL
次に、testはそれらの行を照合するため、テーブル間で一致しないすべての行が検索されます。