我刚刚在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'
该查询无需限定您要表示的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上的内部连接导致错误。 我的实际查询还有几个关于订单项的连接,最初我只使用第一个表,例如,,效果很好。 有没有什么方法可以在查询中定义这个表的并集,使其不含糊?