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
Първата версия е по-интуитивна, но мисля, че втората версия обикновено има по-добра производителност (ако приемем, че имате индекси на колоните, използвани в присъединяването).
Втората версия работи, защото LEFT JOIN
връща ред за всички редове в първата таблица. Когато ON
условието е успешно, тези редове ще включват колоните от втората таблица, точно както INNER JOIN
. Когато условието е неуспешно, върнатият ред ще съдържа NULL
за всички колони във втората таблица. WHERE l.id IS NULL
test след това съвпада с тези редове, така че намира всички редове, които нямат съвпадение между таблиците.