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

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

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

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

这个查询没有限定您所指的状态列,它神奇地工作了!不管语义或查询返回什么,都没有错误。USER_CONSTRAINTS甚至还有一个名为STATUS的列,那么当有两个列可供选择时,它怎么会不知道该做什么,但如果有更多不明确的列,它是可以接受的吗?

顺便说一句,这都是在10.2.0.3.0上实现的,实际上,如果查询中有两个以上的表,ORA-00918就会停止引发。如果这是Oracle的bug,谁知道它是什么时候修复的,所以如果我们的数据库升级了,哪个Oracle版本可能会导致牛仔查询失败?

更新

感谢BQ演示了11.2.0.1.0中的错误已修复。赏金给任何人,可以显示它在较早的版本修复!

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-11-25 00:53:04

不能说它是什么时候修复的,但这是我的结果:

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
票数 8
EN

Stack Overflow用户

发布于 2010-11-30 01:38:31

搜索Oracle支持并找到以下内容:

错误5368296 - ANSI join SQL可能不会为不明确的列ID 5368296.8报告ORA-918

确认受影响的版本:

  • 10.2.0.3
  • 10.2.0.4

此问题已在中修复

Windows Platforms

  • 10.2.0.5上的服务器修补程序10.2.0.4修补程序2(服务器修补程序Set)

  • 11.1.0.6 (基础版本)

没有发布更多,因为您需要Oracle支持帐户来查看详细信息,但认为受影响的Oracle Bug编号/版本可以分享,以便在Oracle支持上为您指明正确的方向。

票数 13
EN

Stack Overflow用户

发布于 2010-11-25 00:52:21

您正在使用ANSI SQL。我猜测它将where子句中的状态与driving表相关联。

当您使用"oracle“语法时,您将看到预期的行为。

SELECT *
FROM USER_TABLES TAB, USER_TRIGGERS TRG, USER_CONSTRAINTS CON
WHERE TRG.TABLE_NAME = TAB.TABLE_NAME
AND CON.TABLE_NAME = TAB.TABLE_NAME
AND STATUS = 'DISABLED'
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4269205

复制
相关文章

相似问题

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