Heim > Fragen und Antworten > Hauptteil
P粉5961619152023-08-25 09:32:07
为了完整起见(我真的相信它更适合),我鼓励您使用简单的 NOT EXISTS
。
SELECT * FROM reservation R WHERE NOT EXISTS ( SELECT 1 FROM reservation_log WHERE reservation_id = R.id AND change_type = 'cancel' );
P粉6920525132023-08-25 00:35:13
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
测试会匹配这些行,因此它会找到表之间不匹配的所有行。