示例: 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的平均教育级别。
查询生成的结果表具有以下值。
| 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 |