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 然后测试匹配这些行,因此它会找到表之间没有匹配项的所有行。