Oracle左连接查询意外过滤空值行问题求助
问题原因分析
你遇到的问题核心在于WHERE子句对NULL值的处理:
左连接后,没有对应销售代表的客户行中,s.ename的值是NULL。而NULL参与任何LIKE比较运算时,结果都会是NULL,WHERE子句会自动排除所有结果为FALSE或NULL的行,所以这些无销售代表的客户就被过滤掉了。
两种修正方案
方案1:将过滤条件移至JOIN的ON子句
把销售代表的姓名过滤条件放到左连接的ON子句中,这样在执行连接操作时就会排除不符合条件的销售代表,同时保留所有客户(包括无对应销售代表的):
select c.custid "Customer ID" ,c.name "Customer Name" ,s.ename "Sales Rep" from customer c left outer join emp s on c.repid = s.empno and (s.ename not like '%R' and s.ename not like '%R_') order by c.name ;
方案2:在WHERE子句中允许NULL值
在WHERE条件里明确加上s.ename IS NULL的判断,让无销售代表的客户行也能通过过滤:
select c.custid "Customer ID" ,c.name "Customer Name" ,s.ename "Sales Rep" from customer c left outer join emp s on c.repid = s.empno where (s.ename is null or (s.ename not like '%R' and s.ename not like '%R_')) order by c.name ;
两种方案的差异
- 方案1是连接阶段过滤:先筛选出符合条件的销售代表,再和客户表左连接,逻辑上更高效,因为减少了后续需要处理的连接行数。
- 方案2是连接后过滤:先完成全量左连接,再筛选出符合条件的行,结果和方案1一致,但性能略逊于前者(数据量小时差异不明显)。
内容的提问来源于stack exchange,提问作者Layla
相关产品推荐
相关产品推荐

