【问题标题】:Visibility of identifiers between Oracle 10g and 11gOracle 10g 和 11g 之间标识符的可见性
【发布时间】:2015-04-25 21:08:57
【问题描述】:

我有一个子查询中包含子查询的查询。内部子查询与外部查询的结果相关:

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: "EMPLOYEES"."DEPTNO": 无效标识符"

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

上面的代码是对我的问题的简化。由于某种原因,我无法通过另一个联接解决问题,也无法使用存储过程或辅助视图。如何使此代码在单个查询中与 Oracle 11 一起使用?

【问题讨论】:

  • 请提供确切的数据库版本。
  • 12.1.0.2 不是问题
  • 根据@LalitKumarB 的回答,最好的解决方案是联系Oracle 支持或应用最新的11g 补丁集。
  • 您显示的内容在 10.2.0.5 中也不起作用,可能是因为提到了向后移植 ibre5041。您不能引用一个标识符(在这种情况下是您的员工别名)超过一级子查询。如果没有看到更现实、更简单的示例以及您正在使用的限制,很难说如何解决它 - 为什么您不能加入,为什么您有额外级别的子查询,这在示例中是多余的,是否你可以使用 CTE...
  • 在问题中添加了 Oracle 版本

标签: sql oracle11g oracle10g ora-00904


【解决方案1】:

你可以访问 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 
;

【讨论】:

  • 重复 DNAME 不是问题,因为它处于不同的级别,并且最里面的查询不需要别名。这些更改不会造成伤害,但也无法解决问题,即employees 在嵌套子查询中不可见。
猜你喜欢
  • 2011-08-13
  • 2011-01-29
  • 2014-02-22
  • 1970-01-01
  • 1970-01-01
  • 2011-02-16
  • 1970-01-01
  • 2018-05-22
  • 1970-01-01
相关资源
最近更新 更多