我刚刚在 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
so 的列,以便让查询运行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 中修复。任何可以在早期版本中修复它的人的赏金!