SQL查询求助:如何获取另一张表中不存在的指定字段数据
解决Table_1中Var1不在Table_2 Value2中的数据查询问题
嗨,我来帮你搞定这个SQL查询的问题!首先先理清楚你的需求:从Table_1里筛选出Var1字段的值没有出现在Table_2的Value2字段中的数据。先纠正个小细节,你给出的期望输出里ID应该是2和3(对应Var1=456和789),不是1和4哦,应该是笔误啦~
你原来SQL的问题
你写的left join加where t1.Var1 not in t2.Value2逻辑有问题:
- 当
LEFT JOIN没有匹配到Table_2的行时,t2.Value2会是NULL,而NOT IN遇到NULL会直接返回空结果,因为SQL里任何值和NULL比较都是未知; - 而且
LEFT JOIN后再用NOT IN完全没必要,逻辑上绕了弯路。
正确的查询方法
这里给你三种常用且靠谱的写法,都能得到你想要的结果:
方法1:使用NOT IN
SELECT ID, Var1, Var2 FROM Table_1 WHERE Var1 NOT IN (SELECT Value2 FROM Table_2)
说明:子查询先取出Table_2所有的Value2值,再筛选Table_1中Var1不在这个集合里的行。如果Table_2的Value2可能存在NULL值,记得在子查询里加WHERE Value2 IS NOT NULL,否则NOT IN会返回空结果。
方法2:使用LEFT JOIN + IS NULL(推荐,更安全)
SELECT t1.ID, t1.Var1, t1.Var2 FROM Table_1 t1 LEFT JOIN Table_2 t2 ON t1.Var1 = t2.Value2 WHERE t2.Value2 IS NULL
说明:左连接会保留Table_1的所有行,那些在Table_2里找不到匹配的行,t2的所有字段都会是NULL。我们只需要筛选t2.Value2为NULL的行,就是目标数据。这个方法不受NULL值影响,兼容性和稳定性都很好。
方法3:使用NOT EXISTS
SELECT ID, Var1, Var2 FROM Table_1 t1 WHERE NOT EXISTS ( SELECT 1 FROM Table_2 t2 WHERE t2.Value2 = t1.Var1 )
说明:NOT EXISTS会检查是否不存在与Table_1当前行匹配的Table_2行,只要找不到匹配就会保留该行。这个方法在有合适索引的情况下效率很高,同样不受NULL值影响。
验证结果
用你的表数据测试的话,这三种写法都会返回:
ID Var1 Var2 2 456 12 3 789 11
完全符合你的需求~
内容的提问来源于stack exchange,提问作者Rahul shah
相关产品推荐
相关产品推荐

