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
測試會符合這些行,因此它會找到表之間不匹配的所有行。