为什么Oracle没有为此查询引发"ORA-00918:列模糊定义"?

bat*_*wad 17 sql oracle oracle10g oracle11g ora-00918

我刚刚在Oracle中遇到了一个奇怪的行为,我期望ORA-00918被提升,但事实并非如此.例如,以此查询为例.

SELECT *
FROM USER_TABLES TAB
JOIN USER_TRIGGERS TRG ON TRG.TABLE_NAME = TAB.TABLE_NAME
WHERE STATUS = 'DISABLED'
Run Code Online (Sandbox Code Playgroud)

此查询在概念上寻找具有禁用触发器的表的详细信息,但请注意,这不是我想要解决的问题.该查询,数据字典,视图或表格不是唯一的问题; 据我所知,它适用于任何一组表或视图(从我试过的两三个).

无论如何,尝试运行此查询,你会得到ORA-00918,因为两者USER_TABLESUSER_TRIGGERS有一个名为列STATUS,从而得到查询运行WHERE条款需要更改到TRG.STATUS.好吧,很酷,但尝试加入另一张桌子.

SELECT *
FROM USER_TABLES TAB
JOIN USER_TRIGGERS TRG ON TRG.TABLE_NAME = TAB.TABLE_NAME
JOIN USER_CONSTRAINTS CON ON CON.TABLE_NAME = TAB.TABLE_NAME
WHERE STATUS = 'DISABLED'
Run Code Online (Sandbox Code Playgroud)

这个查询,没有限定你的意思是哪个STATUS列,神奇地工作!别介意语义或查询返回的内容,没有错误. USER_CONSTRAINTS甚至还有一个名称STATUS也是如此,所以当有两列可供选择时它怎么会不知道该怎么做但是它更加模棱两可呢?

顺便说一下,这一切都在10.2.0.3.0上,如果你的查询中有两个以上的表,ORA-00918就会停止被提升.如果这是一个Oracle错误,有人知道它何时被修复,那么如果我们的数据库升级,哪个Oracle版本可能会导致牛仔查询爆炸?

更新

感谢BQ用于演示该错误已在11.2.0.1.0中修复.任何可以在早期版本中修复它的人的赏金!

BQ.*_*BQ. 13

搜索了Oracle支持,发现了这个:

错误5368296 - ANSI联接SQL可能不会为不明确的列报告ORA-918 [ID 5368296.8]

确认受影响的版本:

  • 10.2.0.3
  • 10.2.0.4

此问题已修复

  • 10.2.0.4 Windows平台上的补丁2
  • 10.2.0.5(服务器补丁集)
  • 11.1.0.6(基础版)

由于您需要Oracle支持帐户才能查看详细信息,因此不会发布更多信息,但认为可以分享受影响的Oracle Bug编号/版本,以便在Oracle支持上指明您的正确方向.


BQ.*_*BQ. 8

不能说什么时候修好了,但这是我的结果:

Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
Data Mining and Real Application Testing options

SQL> SELECT *
  2  FROM USER_TABLES TAB
  3  JOIN USER_TRIGGERS TRG ON TRG.TABLE_NAME = TAB.TABLE_NAME
  4  WHERE STATUS = 'DISABLED';
WHERE STATUS = 'DISABLED'
      *
ERROR at line 4:
ORA-00918: column ambiguously defined

SQL> ed
Wrote file afiedt.buf

  1  SELECT *
  2  FROM USER_TABLES TAB
  3  JOIN USER_TRIGGERS TRG ON TRG.TABLE_NAME = TAB.TABLE_NAME
  4  JOIN USER_CONSTRAINTS CON ON CON.TABLE_NAME = TAB.TABLE_NAME
  5* WHERE STATUS = 'DISABLED'
SQL> /
WHERE STATUS = 'DISABLED'
      *
ERROR at line 5:
ORA-00918: column ambiguously defined
Run Code Online (Sandbox Code Playgroud)