一尘不染

Oracle为什么不为该查询引发``RA-00918:列定义不明确''?

sql

我刚刚在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_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'

该查询无需限定您要表示的STATUS列,就可以神奇地起作用!不用担心语义或查询返回的内容,没有错误。
USER_CONSTRAINTS甚至还有一个列也被调用STATUS,所以当有两个列可供选择时,为什么不知道该怎么办,但是如果存在更多歧义,这还可以吗?

顺便说一下,所有这些都在10.2.0.3.0上,并且如果查询中有两个以上的表,那么实质上就不会引发ORA-00918。如果这是一个Oracle错误,是否有人知道它的修复时间,如果升级我们的数据库,哪个Oracle版本可能导致牛仔查询崩溃?

更新

感谢BQ演示该错误已在11.2.0.1.0中修复。凡是可以在更早版本中显示它的人都可以得到赏金!


阅读 158

收藏
2021-05-05

共1个答案

一尘不染

无法确定修复的时间,但这是我的结果:

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
2021-05-05