使用Toad实现SQL查询:Table1有Item且Table2同Mfg Number全无Item的记录
正确实现SQL查询:筛选Table2中对应Mfg Number全为空Item number的记录
需求回顾
- 从Table1中选取自身Item number不为空的Mfg Number
- 仅保留那些在Table2中所有对应记录的Item number均为空的Mfg Number
原SQL问题分析
你原来的SQL语句会错误返回Mfg Number=1和2,原因是它仅关联了Table2中存在空Item number的记录,但没有排除Table2中同时存在非空Item number的Mfg Number。比如Mfg Number=1在Table2里既有非空记录也有空记录,原语句会把空记录和Table1关联,导致不符合要求的记录被返回。
正确实现方法
方法1:使用NOT EXISTS子查询(推荐,性能更优)
SELECT DISTINCT t1.* FROM Table1 t1 WHERE t1.`Item number` IS NOT NULL AND NOT EXISTS ( SELECT 1 FROM Table2 t2 WHERE t2.`Mfg Number` = t1.`Mfg Number` AND t2.`Item number` IS NOT NULL );
逻辑说明:
- 先筛选Table1中Item number非空的记录
- 通过
NOT EXISTS检查:如果Table2中不存在当前Mfg Number对应的非空Item number记录,说明该Mfg Number在Table2中所有Item number都是空,符合需求
方法2:使用GROUP BY + HAVING筛选
SELECT t1.* FROM Table1 t1 INNER JOIN ( SELECT `Mfg Number` FROM Table2 GROUP BY `Mfg Number` HAVING COUNT(`Item number`) = 0 ) t2_filtered ON t1.`Mfg Number` = t2_filtered.`Mfg Number` WHERE t1.`Item number` IS NOT NULL;
逻辑说明:
- 子查询对Table2按Mfg Number分组,
COUNT(Item number)会自动忽略NULL值,结果为0说明该分组下所有Item number都是空 - 将筛选后的Mfg Number和Table1关联,得到最终符合条件的记录
示例数据验证
针对你的示例数据:
- Mfg Number=1:Table2存在非空Item number,被排除
- Mfg Number=2:Table2所有Item number为空,会被返回
- Mfg Number=3:Table2全为非空Item number,被排除
内容的提问来源于stack exchange,提问作者Robert Nording
相关产品推荐
相关产品推荐

