当前位置: 首页 > 面试题库 >

Oracle为什么不为该查询引发``RA-00918:列定义不明确''?

谷梁俊楚
2023-03-14
问题内容

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

该查询无需限定您要表示的STATUS列,就可以神奇地起作用!不用担心语义或查询返回的内容,没有错误。
USER_CONSTRAINTS甚至还有一个列也被调用STATUS,所以当有两个列可供选择时,为什么不知道该怎么办,但是如果存在更多歧义,这还可以吗?

顺便说一下,所有这些都在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


 类似资料:
  • 因此,我在使用多个临时表生成查询时遇到了一些问题。 首先,我创建了临时表。 然后我写下我的查询如下。这似乎是一个简单的查询。然而,我得到了错误“ORA-00918:列定义不明确”。我不知道是否可以连接这两个临时表,尤其是它们没有任何关系。我只想查询唯一id在DIDV表中的位置,以及标题和注释列不包含KEW字段的位置。 感谢您对理解这一点的任何帮助。 如果需要任何澄清,请告诉我。

  • 问题内容: 我有一个查询,在我认为可能不使用索引的情况下,出于好奇,我将其重现: 创建一个具有1.000.000行(在中有10个不同的值,在中有500个字节的数据)的。 创建一个索引并收集表统计信息: 尝试获取和的不同值: 不使用索引,前提是提示不会更改。 我想在这种情况下不能使用索引,但是为什么呢? 问题答案: 我运行了Peter的原始内容并复制了他的结果。然后我应用了dcp的建议… 之所以如此

  • 问题内容: 如中所述,HTML中的单引号什么时候变得如此流行?和Jquery在attribute中嵌入引号, HTML上的Wikipedia条目表示以下内容: 当单引号字符(’)用于引用属性值时,当它出现在属性值本身中时,也必须转为或(不应与XHTML文档中的字符一样转义)。 为什么不应该使用?另外,可以安全地使用它吗? 问题答案: 在有效HTML4实体]的正式列表中,但不是。 从C.16起。命名

  • 问题内容: 有什么不同之处与使得迭代器不会引发异常而引发异常?最后,两者都在修改集合大小。 请在这里忽略多线程。我只是在谈论一个for-each循环和一个迭代器循环。据我所知,for-each循环仅在内部创建迭代器。 我很困惑。 问题答案: 不会抛出,因为这是在迭代时修改集合的 允许 方式。这是什么的Javadoc的说: 从基础集合中移除此迭代器返回的最后一个元素(可选操作)。每次调用next()

  • 问题内容: 需要对以下代码进行澄清: 这将打印出来,以便证明和对象引用相同的内存引用。 这将打印出来,也证明是相同的。 显然,这将引发,因为我试图调用空引用。 所以这是我的问题,为什么最后一个代码示例没有抛出,因为我从前两个示例中看到并理解的是,如果两个对象都引用同一个对象,那么如果我们更改任何值,那么它也会反映给另一个对象,因为两个对象都指向相同的内存引用。那么,为什么该规则在这里不适用?如果我

  • 我有两个数据相似的表,我需要查询表的并集。我更改了实际使用的表名,只是为了说明这个问题: 我得到 ORA-00918:列定义模糊 由于PKG\u ID上的内部连接导致错误。 我的实际查询还有几个关于订单项的连接,最初我只使用第一个表,例如,,效果很好。 有没有什么方法可以在查询中定义这个表的并集,使其不含糊?