子查询连接中的差异可见性和位置

时间:2014-06-12 15:29:00

标签: 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
)

最后一个查询works完美无缺。

为什么无法在join中进行此操作?该表应该像where子句中那样可见。我错过了什么吗?

1 个答案:

答案 0 :(得分:3)

FROM working_place wp 
JOIN working_place_worker wpw ON ... 
WHERE ...

ON子句仅将 引用到参与联接的两个表,即wpwpw。外部查询中的名称对它不可见。

WHERE子句(及其表兄HAVING是外部查询与子查询相关的方式。外部查询的名称对其可见。

为了便于记忆,

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

虽然SQL解析器将在ON子句中接受文字(不是列名),但它会在引用连接外部的列时绘制线。你可以认为这是一种防止错误的好处。

在您的情况下,wo表不属于JOIN,并被拒绝。 整个查询的一部分,并由WHERE识别。