查询DB1表中不存在于DB2表的邮件:SQL结果为0异常排查
排查你的SQL查询返回0结果的问题
嘿,我一眼就看到你当前的查询语句里有几个关键问题,这就是为啥明明有符合条件的数据却返回0结果的原因,咱们一步步来解决:
1. 明显的表名笔误
你看WHERE子句里写的是 DB1.20180319.email,但你要对比的是DB1.20180320表中的邮箱啊!这个笔误会导致数据库找不到对应的字段,直接返回空结果。
2. NOT IN 的NULL陷阱
就算修正了笔误,NOT IN 还有个容易踩的坑:如果子查询(SELECT DB2.20180319.email FROM DB2.20180319 WHERE Status='active')返回的结果里包含NULL值,那么整个NOT IN的判断都会变成UNKNOWN,最终导致没有任何结果被筛选出来。
修正后的两种可靠写法
写法一:修正笔误 + 过滤NULL的NOT IN
SELECT DB1.20180320.email FROM DB1.20180320 WHERE DB1.20180320.email NOT IN ( SELECT DB2.20180319.email FROM DB2.20180319 WHERE Status = 'active' AND DB2.20180319.email IS NOT NULL -- 过滤掉NULL值 )
写法二:更稳妥的NOT EXISTS(推荐)
NOT EXISTS 不会受到NULL值的影响,逻辑也更清晰:
SELECT t1.email FROM DB1.20180320 t1 WHERE NOT EXISTS ( SELECT 1 FROM DB2.20180319 t2 WHERE t2.Status = 'active' AND t2.email = t1.email )
额外检查点
如果还是没结果,你可以再确认这两点:
- 两个表的
email字段类型是否完全一致?比如有没有一个是VARCHAR(50)另一个是VARCHAR(100),或者存在大小写、前后空格的差异? - 手动验证几条你认为符合条件的邮箱,看看它们是否真的不在DB2的active记录里。
内容的提问来源于stack exchange,提问作者Stangn99
相关产品推荐
相关产品推荐

