You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

同表多字段NOT EXISTS查询问题:筛选无对应VALUE3=2的VALUE3=1记录

解决同表中筛选无对应匹配记录的问题

看起来你是想从table1里找出VALUE3=1且不存在相同VALUE1+VALUE2组合、但VALUE3=2的记录——也就是那些(VALUE1, VALUE2)组合只在VALUE3=1分组里出现的行对吧?

先说说你原来SQL的问题:

  • 你错误引用了table2,但所有数据其实都在table1里
  • 虽然NOT EXISTS的逻辑方向是对的,但表名写错导致查询失效

修正后的NOT EXISTS写法(最贴合你的思路)

把子查询的表名改成table1,并且明确关联条件,同时子查询里选1比选具体字段更高效:

SELECT t1.ID, t1.VALUE1, t1.VALUE2, t1.VALUE3
FROM table1 t1
WHERE t1.VALUE3 = 1
AND NOT EXISTS (
    SELECT 1
    FROM table1 t2
    WHERE t2.VALUE1 = t1.VALUE1
      AND t2.VALUE2 = t1.VALUE2
      AND t2.VALUE3 = 2
);

这个查询会逐个检查所有VALUE3=1的行,只要找不到同一(VALUE1, VALUE2)组合且VALUE3=2的记录,就会把它保留下来,正好符合你的期望结果。

另一种常用写法:LEFT JOIN + 筛选NULL

如果你更喜欢用连接的方式,也可以这么写,逻辑和上面完全等价:

SELECT t1.ID, t1.VALUE1, t1.VALUE2, t1.VALUE3
FROM table1 t1
LEFT JOIN table1 t2
  ON t2.VALUE1 = t1.VALUE1
  AND t2.VALUE2 = t1.VALUE2
  AND t2.VALUE3 = 2
WHERE t1.VALUE3 = 1
  AND t2.ID IS NULL;

这里用左连接把VALUE3=1的行和对应的VALUE3=2的行关联起来,最后筛选那些没有匹配到(也就是t2.ID IS NULL)的行,就是你要的结果。

结果验证

执行上面任意一个SQL,都会得到你想要的输出:

ID VALUE1 VALUE2 VALUE3
1 1 1 1
4 1 5 1

为什么其他行被排除了?

  • 行2(2,2,1)能匹配到行5、8(2,2,2),所以被过滤掉
  • 行3(3,4,1)能匹配到行6(3,4,2),所以也被过滤掉
  • 只有行1和行4的(VALUE1, VALUE2)组合,找不到对应的VALUE3=2记录,所以被保留

内容的提问来源于stack exchange,提问作者Abel Juan Rodríguez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 07:57:27