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

时间:2018-09-17 16:21:40

标签: sql oracle subquery

尽管子查询给出了“无效标识符”错误,但我不理解以下查询为何起作用。

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

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

飞机( airc_model(PK),airc_manufact)

飞行( flt_no(PK) airc_model(FK)

如果我自己运行子查询,则由于airc_manufact不在排行表中的列,因此我将收到类似“无效标识符”的错误。

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

在我看来,这似乎是一个错误,因为查询中存在明显的错误。为什么查询运行?我的理解是Oracle将首先运行或评估子查询,然后运行外部查询。

1 个答案:

答案 0 :(得分:6)

您尚未限定列名。因此,您认为自己正在跑步:

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);

作为过滤子句,这毫无用处。

道德:始终限定查询中的列名,尤其是当查询引用多个表时。