Sql Oracle 10g和11g之间标识符的可见性
我有一个在子查询中包含子查询的查询。内部子查询与外部查询的结果相关:Sql Oracle 10g和11g之间标识符的可见性,sql,oracle11g,oracle10g,ora-00904,Sql,Oracle11g,Oracle10g,Ora 00904,我有一个在子查询中包含子查询的查询。内部子查询与外部查询的结果相关: SELECT employees.ENAME, employees.DEPTNO, ( SELECT * FROM (SELECT DNAME FROM DEPT WHERE DEPT.DEPTNO = employees.DEPTNO) ) DNAME FROM EMP employees ; 对于Oracle 10.2.0.1.0,它可以正
SELECT
employees.ENAME,
employees.DEPTNO,
(
SELECT * FROM
(SELECT DNAME FROM DEPT WHERE DEPT.DEPTNO = employees.DEPTNO)
) DNAME
FROM EMP employees
;
对于Oracle 10.2.0.1.0,它可以正常工作,但Oracle 11.2.0.4.0会抛出一个错误:
ORA-00904:“员工”。“部门编号”:无效标识符
如果我在中间删除查询,它也适用于Oracle 11。所以我认为这是一个标识符可见性的问题。
上面的代码是对我的问题的简化。出于某种原因,我无法用另一个连接解决问题,也无法使用存储过程或辅助视图。如何使此代码在一个查询中与Oracle 11一起工作?您是否可以访问10g版本。10.2.0.5?11g对标识符和某些查询的限制确实更大已停止工作。这些更改也被向后移植到终端补丁集(10.2.0.5)。顺便说一句:
- DNAME用作列别名/名称“两次”
- 在只能返回一列的位置使用
SELECT*
- 最里面的查询没有别名
SELECT
employees.ENAME,
employees.DEPTNO,
(
SELECT X.DNAME FROM
(SELECT D.DNAME FROM DEPT D WHERE D.DEPTNO = employees.DEPTNO) X
) AS DNAME
FROM EMP employees
;
请包括确切的DB版本。根据@LalitKumarB answer,与
12.1.0.2
无关,最好的解决方案是联系Oracle支持部门或为11g应用最新补丁集。您所展示的在10.2.0.5中也不起作用,可能是因为提到了后端口ibre5041。您无法引用标识符(本例中为您的员工别名)多个级别的子查询被关闭。如果看不到更现实、不简单的示例以及您正在处理的限制,很难说如何解决它-为什么您不能加入,为什么您在示例中有多余的额外级别的子查询,您是否可以使用CTE…将Oracle版本添加到DN中AME不是问题,因为它处于不同的级别,最里面的查询不需要别名。这些更改不会造成伤害,但也不会解决问题,即员工
在嵌套子查询中不可见。