我在简单连接时遇到了问题:
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
)
最后一个查询有效
完美。
为什么不能在 join
中加入?该表应该像在 where
子句中一样可见。我错过了什么吗?
最佳答案
在
FROM working_place wp
JOIN working_place_worker wpw ON ...
WHERE ...
ON
子句仅引用参与连接的两个表,即wp
和wpw
。来自外部查询的名称对其不可见。
WHERE
子句(及其同类 HAVING
是外部查询与子查询关联的方式。来自外部查询的名称是 对它可见。
为了便于内存,
- ON 是关于 JOIN,两个表如何关联形成一行(或多行)
- WHERE 是关于选择标准,行必须通过的测试
虽然 SQL 解析器将在 ON 子句中接受文字(不是列名),但它会在对连接外的列的引用处画线。您可以将此视为防止错误的帮助。
在您的情况下,wo
表不是JOIN
的一部分,因此被拒绝。它是整个查询的一部分,并被WHERE
识别。
关于sql - 子查询连接和 where 中的差异可见性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24188292/