为什么Oracle不为该查询提出“ora-#number0#:列的模糊定义”?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (43)

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

SELECT *
FROM USER_TABLES TAB
JOIN USER_TRIGGERS TRG ON TRG.TABLE_NAME = TAB.TABLE_NAME
WHERE STATUS = 'DISABLED'

这个查询在理论上寻找具有禁用触发器的表的细节,但请注意,这不是我想解决的问题。这个问题不是唯一的,这个查询,数据字典,视图或表; 据我所知它适用于任何一组表或视图(从我尝试的两三个)。

无论如何,尝试运行这个查询,你会得到ORA-00918,因为两者都有,USER_TABLES并且USER_TRIGGERS有一个名为STATUSso 的列来获取查询来运行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'

这个查询,没有限定你的意思是哪个STATUS列,神奇地工作!没关系语义或查询返回的内容,没有错误。 USER_CONSTRAINTS即使有一列也被称为STATUS,所以当有两列可供选择时,它怎么会不知道该怎么做,但更好的方法是更好?

顺便说一句,这是全部在10.2.0.3.0上,如果你的查询中有两个以上的表,ORA-00918会停止。如果这是一个Oracle错误,是否有人知道它什么时候修复,以及哪个Oracle版本可能导致牛仔查询在我们的数据库升级时炸毁?

提问于
用户回答回答于

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

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
用户回答回答于

搜索了Oracle支持并找到了这个:

错误5368296 - ANSI连接SQL可能不会为模糊列报告ORA-918 [ID 5368296.8]

确认受影响的版本:

  • 10.2.0.3
  • 10.2.0.4

这个问题已经修复

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

因为你需要Oracle支持账户才能查看详细信息,所以不要发布更多内容,但认为受Oracle影响的Oracle数量/版本可以共享,从而指引你在Oracle支持的正确方向。

扫码关注云+社区