示例: WHERE 子句中的相关子查询

假设您需要一个其教育水平高于各自部门平均教育水平的所有员工的列表。 要获取此信息, SQL 必须搜索 CORPDATA.EMPLOYEE 表。

对于表中的每个员工, SQL 需要将员工的教育水平与员工所在部门的平均教育水平进行比较。 在子查询中,指示 SQL 计算当前行中部门编号的平均教育水平。 例如:

  SELECT EMPNO, LASTNAME, WORKDEPT, EDLEVEL
   FROM CORPDATA.EMPLOYEE X
   WHERE EDLEVEL >
      (SELECT AVG(EDLEVEL)
         FROM CORPDATA.EMPLOYEE
         WHERE WORKDEPT = X.WORKDEPT);

相关子查询看起来像不相关的子查询,但存在一个或多个相关引用除外。 在此示例中,单个相关引用是 X.WORKDEPT 。 此处,限定符 X 是外部 SELECT 语句的 FROM 子句中定义的相关名称。 在该子句中,引入了 X 作为表 CORPDATA.EMPLOYEE。

现在,请考虑对 CORPDATA.EMPLOYEE。 在执行之前,出现 X.WORKDEPT 将替换为该行的 WORKDEPT 列的值。 例如,假设该行用于 CHRISTINE I HAAS。 她的工作部门是 A00,这是此行的 WORKDEPT 值。 针对此行执行的子查询为:

  (SELECT AVG(EDLEVEL)
     FROM CORPDATA.EMPLOYEE
     WHERE WORKDEPT = 'A00');

因此,对于所考虑的行,子查询生成 Christine 部门的平均教育水平。 然后在外陈述中把这与克里斯汀自己的教育水平进行比较。 对于 WORKDEPT 具有其他值的其他行,该值将显示在子查询中,以代替 A00。 例如,对于 Michael L THOMPSON 的行,此值为 B01,其行的子查询将提供部门 B01的平均教育级别。

查询生成的结果表具有以下值。

表 1. 先前查询的结果集
EMPNO LASTNAME WORKDEPT EDLEVEL
000010 HAAS A00 18
000030 KWAN C01 20
000070 PULASKI D21 16
000090 HENDERSON E11 16
000110 LUCCHESSI A00 19
000160 PIANKA D11 17
000180 SCOUTTEN D11 17
000210 JONES D11 17
000220 LUTZ D11 18
000240 MARINO D21 17
000260 JOHNSON D21 16
000280 SCHNEIDER E11 17
000320 MEHTA E21 16
000340 GOUNOT E21 16
200010 赫明格 A00 18
200220 JOHN D11 18
200240 蒙泰韦德 D21 17
200280 施瓦茨 E11 17
200340 阿隆索 E21 16