我不明白为什么以下查询有效,尽 pipe 查询给出了“无效标识符”错误。
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 将首先运行或评估子查询,然后运行外部查询。
请您参考如下方法:
您没有限定列名。所以,你认为你正在运行:
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);
这作为过滤子句非常无用。
道德:始终限定查询中的列名,特别是当查询引用多个表时。




