|
Oracle中子查询应用比较普遍,而在应用的过程中,经常受到 null 的干扰,出现一些让人迷惑的异常,这里简单地讨论下。
子查询分为单行子查询(返回结果包含一行)和多行子查询(返回结果可包含多行)。当使用单行子查询时,如果子查询返回的结果为 null,则主查询中 where 条件为 false,不能返回记录行,但这与实际的结果也吻合,因为条件为 null,即不能匹配;
当使用多行子查询时,null 的影响就不容忽视了,这里以SCOTT模式下emp表为例
a.查询所有不是领导的人员
select ename,empno,deptno from emp
where empno not in(select mgr from emp);
这里查询所有工号不在领导工号列表中的人员,从业务逻辑上看没有问题,但很可惜,没有返回结果,难道都是领导?
仔细查看发现 select mgr from emp; 的结果中包含一个null值,当主查询使用 in去一一匹配 mgr 时,运算结果由于 null 值的干扰,将条件变为了 false,使查询没有返回行。接下来就得改造了。。。
select ename,empno,deptno from emp
where empno not in(select mgr from emp where mgr is not null);
这时将子查询中的 null 值去除了,in 的比较结果正常,返回结果符合要求。
当使用 in 等多行子查询运算符时,如果子查询中包含null值,将对结果产生重大影响。 |
|
|