SELECT *
FROM reservation
WHERE id NOT IN (select reservation_id
FROM reservation_log
WHERE change_type = 'cancel')
ODER:
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
Die erste Version ist intuitiver, aber ich denke, dass die zweite Version normalerweise eine bessere Leistung erzielt (vorausgesetzt, Sie haben Indizes für die im Join verwendeten Spalten).
Die zweite Version funktioniert, weil LEFT JOIN
gibt eine Zeile für alle Zeilen in der ersten Tabelle zurück. Wenn ON
Bedingung erfolgreich ist, enthalten diese Zeilen die Spalten aus der zweiten Tabelle, genau wie INNER JOIN
. Wenn die Bedingung fehlschlägt, enthält die zurückgegebene Zeile NULL
für alle Spalten in der zweiten Tabelle. Der WHERE l.id IS NULL
test gleicht dann diese Zeilen ab, also findet es alle Zeilen, die keine Übereinstimmung zwischen den Tabellen haben.