3.5
到此,我们已经了解了四类子查询,但在使用子查询时还要注意以下几点: 例: SELECT deptno,job,AVG(sal) FROM EMP GROUP BY deptno,job HAVING AVG(sal)>(SELECT sal FROM EMP WHERE ename=’MARTIN’); B、 在一些比较复杂的子查询中,可能需要多次处理同一个子查询,为了优化这一步骤,ORACLE9i引入了“WITH”子句来提高这类子查询的性能。 例: SELECT dname,SUM(sal) AS dept_total FROM EMP,DEPT WHERE EMP.deptno=DEPT.deptno GROUP BY dname HAVING SUM(sal)>(SELECT SUM(sal)*1/3 FROM EMP,DEPT WHERE EMP.deptno=DEPT.deptno) ORDER BY SUM(sal) DESC; 显然,子查询“SELECT SUM(sal) FROM EMP,DEPT WHERE EMP.deptno=DEPT.deptno”处理了两次。因此,可以利用O9i中的下来语法来改善性能: WITH summary AS ( SELECT dname,SUM(sal) AS dept_total FROM EMP,DEPT WHERE EMP.deptno=DEPT.deptno GROUP BY dname ) SELECT dname,dept_total FROM summary WHERE dept_total>(SELECT SUM(dept_total)*1/3 FROM summary) ORDER BY dept_total DESC; C、在一些子查询操作,诸如数据分组,可能会产生空值。然而,在子查询把这些数据集返回给主查询时又会忽略空值。因此,应特别小心这种情况。 |