我刚刚在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
。好的,很酷,但是试着加入另一个表。
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'
这个查询没有限定您所指的状态列,它神奇地工作了!不管语义或查询返回什么,都没有错误。USER_CONSTRAINTS
甚至还有一个名为STATUS
的列,那么当有两个列可供选择时,它怎么会不知道该做什么,但如果有更多不明确的列,它是可以接受的吗?
顺便说一句,这都是在10.2.0.3.0上实现的,实际上,如果查询中有两个以上的表,ORA-00918就会停止引发。如果这是Oracle的bug,谁知道它是什么时候修复的,所以如果我们的数据库升级了,哪个Oracle版本可能会导致牛仔查询失败?
更新
感谢BQ演示了11.2.0.1.0中的错误已修复。赏金给任何人,可以显示它在较早的版本修复!
https://stackoverflow.com/questions/4269205
复制相似问题