同表多字段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
相关产品推荐
相关产品推荐

