我在简单加入方面遇到了问题:
SELECT *
FROM worker wo
WHERE EXISTS (
SELECT wp.id_working_place
FROM working_place wp
JOIN working_place_worker wpw ON ( wp.id_working_place = wpw.id_working_place
AND wpw.id_worker = wo.id_worker)
)
我遇到的错误是ORA-00904: "WO"."ID_WORKER": not valid identifier
。
然后我决定将表的并集从join
子句移动到where
子句:
SELECT *
FROM worker wo
WHERE EXISTS (
SELECT wp.id_working_place
FROM working_place wp
JOIN working_place_worker wpw ON ( wp.id_working_place = wpw.id_working_place)
WHERE wpw.id_worker = wo.id_worker
)
最后一个查询works
完美无缺。
为什么无法在join
中进行此操作?该表应该像where
子句中那样可见。我错过了什么吗?
答案 0 :(得分:3)
在
FROM working_place wp
JOIN working_place_worker wpw ON ...
WHERE ...
ON
子句仅将 引用到参与联接的两个表,即wp
和wpw
。外部查询中的名称对它不可见。
WHERE
子句(及其表兄HAVING
是外部查询与子查询相关的方式。外部查询的名称对其可见。
为了便于记忆,
虽然SQL解析器将在ON子句中接受文字(不是列名),但它会在引用连接外部的列时绘制线。你可以认为这是一种防止错误的好处。
在您的情况下,wo
表不属于JOIN
,并被拒绝。 是整个查询的一部分,并由WHERE
识别。