如何不用子查询,通过表连接实现跨表不存在数据查询?
用表连接替代NOT IN子查询实现需求的正确写法
你的原始表连接写法有问题哦——逗号分隔表的内连接只会返回两边都有匹配的行,加上t1.id2 != t2.id2的条件,得到的是t1和t2中id相同但id2不同的所有组合,完全不是你要的“t1中存在但t2中不存在的数据”。
正确的做法是用**左外连接(LEFT JOIN)**配合空值判断,具体SQL如下:
SELECT t1.* FROM table1 t1 LEFT JOIN table2 t2 ON t1.id = t2.id AND t1.id2 = t2.id2 WHERE t1.id = '1' AND t2.id2 IS NULL
逻辑解释
LEFT JOIN会保留t1中所有满足t1.id='1'的行,无论t2里有没有对应的匹配项;- 关联条件
ON t1.id = t2.id AND t1.id2 = t2.id2用来精准匹配两张表中同id、同id2的记录; WHERE t2.id2 IS NULL筛选出的,就是t1里存在,但t2中找不到对应id和id2的行,和你原来的NOT IN子查询效果完全一致。
额外提示
如果t2的id2字段可能存在NULL值,原来的NOT IN子查询会因为NULL的特性导致结果不符合预期,但左连接的写法就不会有这个问题,是更可靠的方案。
内容的提问来源于stack exchange,提问作者user1854438
相关产品推荐
相关产品推荐

