为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

拉丁的传说 2019-06-01 13:48:51
只有当值不存在时才返回行我有两张桌子-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在这里不管用。
查看完整描述

2 回答

?
温温酱

TA贡献1752条经验 获得超4个赞

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测试然后匹配这些行,以便查找表之间不匹配的所有行。


查看完整回答
反对 回复 2019-06-01
  • 2 回答
  • 0 关注
  • 494 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信