SQL表达式中的名称解析(作用域)

时间:2015-11-25 21:26:09

标签: sql

我想知道是否可以引用外部范围中定义的名称。虽然以下查询按预期工作,但我找不到任何关于范围确切如何工作的官方文档。

以下是一个示例查询:

select Calendar.WorkerNumber
from Calendar, Activities
where Calendar.IdA = Activities.IdA and
      Activities.RequestedJob not in (
        select Jobs.Job
        from Jobs
        -- Here I am referencing Calendar.WorkerNumber which is defined in the outer scope
        where Jobs.WorkerNumber = Calendar.WorkerNumber
      )

1 个答案:

答案 0 :(得分:1)

您应该使用JOIN语法:

select Calendar.WorkerNumber
from Calendar
join Activities
  on Calendar.IdA = Activities.IdA
where Activities.RequestedJob not in (
        select Jobs.Job
        from Jobs
        where Jobs.WorkerNumber = Calendar.WorkerNumber
      );

这是correlated subquery的典型例子:

  

在包含相关子查询的查询中(也称为   重复子查询),子查询依赖于它的外部查询   值。这意味着子查询重复执行一次   外部查询可能选择的每一行。

从子查询中,您可以引用外部对象,但反之亦然。如果您使用相同的表两次(outerquery / subquery,则需要使用别名)。

SELECT * 
FROM tab t1
WHERE ID NOT IN (SELECT t2.ID
                 FROM tab t2
                 WHERE t1.colx > t2.colx)