仅当值不存在时返回行
P粉043470158
P粉043470158 2023-08-24 22:07:48
0
2
379
<p>我有 2 张桌子 - <code>预订</code>:</p> <pre class="brush:php;toolbar:false;">id | some_other_column ----+------------------ 1 | value 2 | value 3 | value</pre> <p>第二个表 - <code>reservation_log</code>:</p> <pre class="brush:php;toolbar:false;">id | reservation_id | change_type ----+----------------+------------- 1 | 1 | create 2 | 2 | create 3 | 3 | create 4 | 1 | cancel 5 | 2 | cancel</pre> <p>我只需要选择未取消的预订(本例中仅为 ID 3)。 我可以使用简单的 <code>WHERE change_type = cancel</code> 条件轻松选择“取消”,但我很难选择“不取消”,因为简单的 <code>WHERE</code> 在这里不起作用。</p >
P粉043470158
P粉043470158

全部回复(2)
P粉596161915

为了完整起见(我真的相信它更适合),我鼓励您使用简单的 NOT EXISTS

SELECT * FROM reservation R
WHERE NOT EXISTS (
  SELECT 1 FROM reservation_log
  WHERE reservation_id = R.id
    AND change_type = 'cancel'
);
P粉692052513
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 测试会匹配这些行,因此它会找到表之间不匹配的所有行。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板