我有2张桌子- reservation
:
id | some_other_column
----+------------------
1 | value
2 | value
3 | value
第二张桌子- reservation_log
:
id | reservation_id | change_type
----+----------------+-------------
1 | 1 | create
2 | 2 | create
3 | 3 | create
4 | 1 | cancel
5 | 2 | cancel
我只需要选择未取消的预订(在此示例中仅为ID 3)。我可以轻松地选择带有简单WHERE change_type = cancel
条件的已取消,但由于WHERE
没有在这里取消,所以我在努力避免未取消。
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
测试将匹配这些行,因此它将查找表之间不匹配的所有行。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句