sql - 子查询连接和 where 中的差异可见性

标签 sql database oracle

我在简单连接时遇到了问题:

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 子句引用参与连接的两个表,即wpwpw。来自外部查询的名称对其不可见。

WHERE 子句(及其同类 HAVING 是外部查询与子查询关联的方式。来自外部查询的名称​​是 对它可见。

为了便于内存,

  • ON 是关于 JOIN,两个表如何关联形成一行(或多行)
  • WHERE 是关于选择标准,行必须通过的测试

虽然 SQL 解析器将在 ON 子句中接受文字(不是列名),但它会在对连接外的列的引用处画线。您可以将此视为防止错误的帮助。

在您的情况下,wo 表不是JOIN 的一部分,因此被拒绝。它整个查询的一部分,并被WHERE识别。

关于sql - 子查询连接和 where 中的差异可见性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24188292/

相关文章:

sql - 强制 mysql 在 bit_or 上不返回结果

mysql - sql GROUP BY 和 HAVING 不工作

mysql - 如何创建左连接而不在左侧重复行

c# - Oracle 同义词错误

sql - ORACLE-SQL : Function, 如何检测空选择并返回 0

sql - SQL Server 中特定列的更改跟踪

sql - 如何获取位类型列的计数?

c# - Entity Framework Core,报错Postgres violates foreign key constraint

mysql - 基于主表更新从属表

sql - 动态 Oracle Pivot_In_Clause