我不明白为什么以下查询有效,尽 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); 

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

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


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!