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 - 不是真正的“笛卡尔连接” - 更像是“笛卡尔半连接”。 (“半连接”是一个技术术语,它是IN
或 EXISTS
条件所做的。)
谢谢。结合 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 子查询插入给出 ora937 和 ora 979
Redshift 中的 DAU WAU MAU 错误:[Amazon](500310) 无效操作:由于内部错误,不支持此类关联子查询模式;