问题: 某用户遇到的问题是多层嵌套查询(子查询)时,存在不识别子查询中列名称报错(ORA-00904: “DUAL”.“DUMMY”: invalid identifier)。
该应用程序已经无人维护,无法通过程序升级来改写SQL方式处理,因此需要从数据库角度对此问题进行分析并确认数据库层面是否可以解决。

分析: 经分析结合MOS文档以及实际测试,结论如下:

  1. 从ORACLE官方SUPPORT上查询(参考Table Alias Scope In Correlated Queries Works In 12c But Failed With ORA-904 In 11.2 (Doc ID 2365733.1) Incorrect Syntax Not Detected In Subquery (No ORA-904 Generated) (Doc ID 1327574.1)),这是数据库bug.即Oracle在使用2层及以上嵌套查询(子查询)时,存在不识别子查询中列名称的BUG。
    BUG 名称为Internal Bug 13573394 ORA-00904: “DISTINCT1”.“EMPLOYEEKEY”: INVALID IDENTIFIER OCCURS FROM A QUERY,为内部BUG无法查询到详细信息。

  2. MOS文档上提出的解决方案为升级到12C版本解决此问题。
    另外的解决方案是修改SQL语句,减少查询时的嵌套,或者使用视图等方式来变相实现SQL功能。

实际测试:
–在11.2.0.4版本安装Database Patch Set Update : 11.2.0.4.190115 (28729262)的数据库环境使用MOS文档中提供的测试语句,依然报错。
–在12C版本已经测试SQL可以使用。
测试LOG如下:

Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
Data Mining and Real Application Testing options
SQL> SELECT (
  2     SELECT *
  3     FROM (
  4             SELECT a.dummy
  5             FROM dual a
  6             WHERE a.dummy = dual.dummy
  9  FROM dual;
                WHERE a.dummy = dual.dummy
ERROR at line 6:
ORA-00904: "DUAL"."DUMMY": invalid identifier
select (select * from (select a.dummy from dual a where a.dummy = dual.dummy)) from dual;
若当前使用的版本存在该BUG,会提示"dual.dummy"列"invalid identifier"...
                                    oracle查询结果中嵌套两层子查询,报错无效标识符
到了新的项目组需要接触oracle,但是以前用的大多数都是mysql,sqlserver。像oracle这种土豪配置还是第一次在项目中使用。废话不多说了,进入今天的主题。
项目中有这样的需求,比如我查询A表中的一条记录,然后查询最近一次更新这条记录的人,更新的日志在另外一张表B。那么用Oracle怎么实现呢
首先不能链表,如果链表a表的一天记录会出现多次,因为A->B是1:n的关系。
用mysql的方式大概就是在结果中嵌套一层子查询
select 
                                    如下的SQL语句查询不到任何记录,尽管数据库中有符合条件的记录。这是Oracle三层查询的bug。select cb.* from mw_app.t_cb cb wh如下的SQL语句查询不到任何记录,尽管数据库中有符合条件的记录。这是Oracle三层查询的bug。select cb.* from mw_app.t_cb cb where cb.obj_id in(select cba.channe...
在前面2个章节,我们比较详细的介绍了一些SQL语句的基本用法,但是在我们实际的项目开发中,其实很多时候这些基本的用法远远不能满足我们项目的需求,这个时候就需要我们的嵌套查询。
在SQL语句中,一个select-from-where语句称为一耳光查询快。将一个查询快嵌套在另外一个的where子句或having 短语的条件的查询称为嵌套查询(Nested Query)。
比如,先举一个简单...
                                    <br />关于 Exists 的几种嵌套查询实践<br />这里人个实践关于Exists、not Exists 的两层嵌套查询,其实知道了两层的嵌套查询就可以推知多层嵌套查询,并且两层嵌套还有口诀可记。<br /><br /><br />1、Exists、not Exists 单独应用<br /><br /><br /><br />题目:<br />a、检索选修了课程的同学信息 =可理解为:查找所有学生表中存在
于学生选课表中的学生记录<br /><br /><br />b、检索没有选修了课程的同学信息
		select * from (
			select xx from table1 where id = table2.id order by time desc
		) where rownum = 1
	) as xx,table2.* 
	from yy table2 where id = 'xx'
这样的语句在Navicat里面是可以执行的,但是放在生产库执行就报错了,错误是ORA-00904,table2.
例似这样的两层嵌套,会报错,报错如下 表2.列:
 invalid identifier,经过查询文档:
oracle给出的解释: 测试语句 select (select * from (select a.dummy from
                                    Oracle数据库表嵌套查询问题目前有两张表type--------------------ID|  Name--------------------1 |  林地--------------------2 |  耕地--------------------groundID|oldtype |nowtype----------------------------------...
                                    第二层子查询居然不认最外层表中的列,网上查了一把发现有人也遇到这种情况,但没说明具体是为什么,不得其解,放上来请教高手以下引用别人的提问,和我的情况一样:我们碰到了一个问题,在oracle 10g 64 bit里使用超过两层的子查询出错,提示Ora-00904,但是在32bit的oracle 中却可以正常运行,问题如下:(原问题并非如此,作了简化)表A1create table A1(PERIOD...