SELECT *
FROM reservation
WHERE id NOT IN (select reservation_id
FROM reservation_log
WHERE change_type = 'cancel')
ELLER:
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
Den første version er mere intuitiv, men jeg tror, at den anden version normalt får bedre ydeevne (forudsat at du har indekser på de kolonner, der bruges i joinforbindelsen).
Den anden version virker fordi LEFT JOIN
returnerer en række for alle rækker i den første tabel. Når ON
betingelse lykkes, vil disse rækker inkludere kolonnerne fra den anden tabel, ligesom INNER JOIN
. Når betingelsen mislykkes, vil den returnerede række indeholde NULL
for alle kolonnerne i den anden tabel. WHERE l.id IS NULL
test matcher derefter disse rækker, så den finder alle de rækker, der ikke matcher tabellerne.