我刚刚在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有一个名为列STATUS,从而得到查询运行WHERE条款需要更改为TRG.STATUS。好的,很酷,但是请尝试加入另一个表。
USER_TABLES
USER_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,所以当有两个列可供选择时,为什么不知道该怎么办,但是如果存在更多歧义,这还可以吗?
USER_CONSTRAINTS
顺便说一下,所有这些都在10.2.0.3.0上,并且如果查询中有两个以上的表,那么实质上就不会引发ORA-00918。如果这是一个Oracle错误,是否有人知道它的修复时间,如果升级我们的数据库,哪个Oracle版本可能导致牛仔查询崩溃?
更新
感谢BQ演示该错误已在11.2.0.1.0中修复。凡是可以在更早版本中显示它的人都可以得到赏金!
无法确定修复的时间,但这是我的结果:
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