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

时间:2015-02-24 09:46:56

标签: 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,它运行正常,但Oracle 11.2.0.4.0会抛出错误:

  

ORA-00904:"员工"。" DEPTNO":无效的标识符"

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

上面的代码简化了我的问题。出于某种原因,我无法通过其他连接来解决问题,并且我无法使用存储过程或辅助视图。如何在单个查询中使此代码与Oracle 11一起使用?

1 个答案:

答案 0 :(得分:0)

您是否可以访问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 
;