下面的子查询query1运行良好。但是,当我把equi条件放在query2之类的嵌套子句中时,它显示了错误ORA-00904。这是相关子查询的错误使用还是因为其他原因?
--Query1: It shows expected result.
SELECT
O.ENAME
O,SAL
,(SELECT COUNT(*)
FROM SCOTT.EMP I
WHERE I.SAL>O.SAL --correlated to outer
) AS RESULT
from SCOTT.EMP O;
--Query2:ORA-00904: "O"."SAL": invalid identifier shows. How to modify to use correlated subquery?
SELECT
O.ENAME
O,SAL
,(
WITH TEMP AS
(
SELECT COUNT(*)
FROM SCOTT.EMP I
WHERE I.SAL>O.SAL --I have put equi condistion here
)
SELECT * FROM TEMP
) AS RESULT
from SCOTT.EMP O;
我认为第二个选项错误地使用了相关子查询,不是因为比较,而是因为使用了with子句我想记住,您应该尽可能避免相关的子查询。
WITH子句或子查询分解子句可以作为内联视图处理,也可以作为临时表解析。后者的优点是,重复引用子查询可能更有效,因为数据很容易从临时表中检索,而不是由每个引用重新查询。
在第二个查询的第三列中,您希望从内联视图中获得结果。问题是内联视图的解析是独立完成的,因此不能引用外部查询中的任何内容。
SQL> create table emp ( ename varchar2(10) , sal number ) ;
Table created.
SQL> insert into emp values ( 'AAA' , 1000 ) ;
insert into emp values ( 'BBB' , 1000 ) ;
insert into emp values ( 'CCC' , 1000 ) ;
insert into emp values ( 'DDD' , 1000 ) ;
1 row created.
SQL> SQL>
1 row created.
SQL> SQL>
1 row created.
SQL> SQL>
1 row created.
SQL> select * from emp ;
ENAME SAL
---------- ----------
AAA 1000
BBB 1000
CCC 1000
DDD 1000
要编写具有内联视图的查询,必须在外部查询中进行筛选
SELECT
O.ENAME
O,SAL
,(
WITH TEMP AS
(
SELECT * FROM EMP
)
SELECT count(*) FROM TEMP t WHERE t.SAL>O.SAL
) AS RESULT
from EMP O;
O SAL RESULT
---------- ---------- ----------
AAA 1000 0
BBB 1000 0
CCC 1000 0
DDD 1000 0
已经解释过第二个查询没有正确使用with
。
但是,让我建议您的查询可以更简单、更有效地措辞。对于每个员工,您需要计算有多少员工的工资更高。窗口功能在这里是可行的:
select e.*, rank() over(order by salary desc) - 1 result
from scott.emp e