尽管子查询给出了“无效标识符”错误,但我不理解以下查询为何起作用。
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将首先运行或评估子查询,然后运行外部查询。
答案 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);
作为过滤子句,这毫无用处。
道德:始终限定查询中的列名,尤其是当查询引用多个表时。