oracle 忽略子查询中的无效标识符错误

Posted

技术标签:

【中文标题】oracle 忽略子查询中的无效标识符错误【英文标题】:oracle ignores invalid identifier error in subquery 【发布时间】:2018-09-17 16:21:40 【问题描述】:

我不明白为什么以下查询有效,尽管子查询给出了“无效标识符”错误。

SELECT *
FROM aircraft
WHERE airc_manufact IN (SELECT airc_manufact FROM flight);

我的表格如下所示(缩写):

AIRCRAFT(airc_model (PK),airc_manufact)

飞行(flt_no (PK)airc_model (FK)

如果我自己运行子查询,我会收到一个“无效标识符”错误,因为 airc_manufact 不是飞行表中的列。

如果我运行整个查询,则不会收到错误消息。 Oracle 似乎忽略了子查询,因此给了我飞机表中的所有行。

对我来说,这似乎是一个错误,因为查询中有一个明显的错误。为什么查询会运行?我的理解是,Oracle 会先运行或评估子查询,然后再运行外部查询。

【问题讨论】:

子查询从外部查询中获取列。提示:笛卡尔连接 @dustytrash - 不是真正的“笛卡尔连接” - 更像是“笛卡尔半连接”。 (“半连接”是一个技术术语,它是 INEXISTS 条件所做的。) 谢谢。结合 Gordon 的回答,很有道理。 【参考方案1】:

您没有限定列名。所以,你认为你在跑步:

SELECT a.*
FROM aircraft a
WHERE a.airc_manufact IN (SELECT f.airc_manufact FROM flight f);

如果f.airc_manufact 不存在,则范围规则说要查看外部查询。所以,你真正在运行的是:

SELECT a.*
FROM aircraft a
WHERE a.airc_manufact IN (SELECT a.airc_manufact FROM flight f);

这作为一个过滤子句非常无用。

道德:总是限定查询中的列名,特别是当查询引用多个表时。

【讨论】:

谢谢!这是我正在寻找的答案。没错,当您这样描述子查询时,它没有意义。明白了!

以上是关于oracle 忽略子查询中的无效标识符错误的主要内容,如果未能解决你的问题,请参考以下文章

Oracle SQL - 多级相关子查询不起作用

sql中带有无效标识符错误的子查询

ORACLE ORA-00904: 无效标识符错误

oracle 子查询插入给出 ora937 和 ora 979

oracle11g 二级子查询 无法引用到外面别名,

Redshift 中的 DAU WAU MAU 错误:[Amazon](500310) 无效操作:由于内部错误,不支持此类关联子查询模式;