Oracle 10g和11g之间标识符的可见性



我有一个查询,其中有一个子查询。内部子查询与外部查询的结果有关:

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:"员工"。"DEPTNO":无效标识符"

如果我删除中间的查询,它也适用于Oracle11。所以我认为这是标识符可见性的问题。

上面的代码简化了我的问题。由于某些原因,我无法使用另一个联接来解决问题,也无法使用存储过程或辅助视图。如何在一个查询中使此代码与Oracle11协同工作?

您是否可以访问10g版本10.2.0.5?11g对标识符的限制确实更严格,一些查询停止了工作。这些变化也被移植到终端补丁集(10.2.0.5)

  • DNAME被用作列别名/名称"两次"
  • 在只能返回一列的位置使用SELECT *
  • 最里面的查询没有别名

我认为Oracle在某种程度上对标识符名称感到困惑,可能错误消息具有误导性,问题出在其他地方。

关于:

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 
;

最新更新