Oracle 11g上的select子句中的双/随机别名不会引发无效的标识符异常

Jak*_*kob 9 sql oracle oracle11g

昨天我在客户Oracle 10g实例上偶然发现了一些奇怪的行为.我写的一些程序给了我一个invalid identifier例外但在我的Oracle 11g实例上运行正常.

相关查询类似于以下内容:

select b.b.v_col_b 
from tbla a
left join tblb b on a.pk_col_a = b.fk_a;
Run Code Online (Sandbox Code Playgroud)

请注意b.b.v_col_b查询的一部分.从更改left joininner join没有最后提出一个ORA-00904: "B"."B"."V_COL_B": invalid identifier例外,但是:

  1. 这不是语法错误吗?
  2. 有人可以解释这种行为吗?

可以在sqlfiddle上找到工作演示

编辑:添加表定义:

create table tbla (
  pk_col_a int primary key, 
  v_col_a varchar2(50));

create table tblb (
  pk_col_b int primary key, 
  fk_a int, 
  v_col_b varchar2(50));
Run Code Online (Sandbox Code Playgroud)

编辑2:正如@LalitKumarB所提到的,这似乎只发生在Oracle 11g上

小智 2

恭喜你,你发现了一个错误:)

在这种特殊情况下,您可以在选择任何 tblb 列时编写您想要的任何内容:

select helloworld.b.v_col_b, mghjfghj.b.fk_a, asdasdas.b.pk_col_b
from tbla a
left join tblb b on a.pk_col_a = b.fk_a;
Run Code Online (Sandbox Code Playgroud)

您甚至可以通过右连接来做到这一点:

select helloworld.b.v_col_b, mghjfghj.b.fk_a, asdasdas.b.pk_col_b
from tblb b
right join tbla a on a.pk_col_a = b.fk_a;
Run Code Online (Sandbox Code Playgroud)

但它不适用于 Oracle 连接语法( (+) 符号)。

这不是预期的行为,正如 Lalit 在评论中指出的那样,已在 12C 中修复。如果需要,您可以向 Oracle 支持部门提交错误请求。也许已经有一个补丁了。