首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么Oracle不为这个查询增加"ORA-00918:定义不明确的列“?

为什么Oracle不为这个查询增加"ORA-00918:定义不明确的列“?
EN

Stack Overflow用户
提问于 2010-11-25 00:39:58
回答 5查看 15.9K关注 0票数 17

我刚刚在Oracle中遇到了一种奇怪的行为,我本希望ORA-00918会被提升,但事实并非如此。

代码语言:javascript
复制
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。好的,很酷,但是试着加入另一个表。

代码语言:javascript
复制
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中的错误已修复。赏金给任何人,可以显示它在较早的版本修复!

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4269205

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档