【问题标题】:oracle ignores invalid identifier error in subqueryoracle 忽略子查询中的无效标识符错误
【发布时间】: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 的回答,很有道理。

标签: sql oracle subquery


【解决方案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);

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

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

【讨论】:

  • 谢谢!这是我正在寻找的答案。没错,当您这样描述子查询时,它没有意义。明白了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多