只有当值不存在时才返回行

只有当值不存在时才返回行

我有两张桌子-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在这里不管用。


拉丁的传说
浏览 523回答 2
2回答

温温酱

SELECT *FROM reservationWHERE id NOT IN (select reservation_id                 FROM reservation_log                  WHERE change_type = 'cancel')或:SELECT r.*FROM reservation rLEFT 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测试然后匹配这些行,以便查找表之间不匹配的所有行。
打开App,查看更多内容
随时随地看视频慕课网APP