使用 UNION 关键字来组合子查询
通过使用 UNION 关键字,可以组合两个或多个子查询以形成全查询。
当 SQL 迂到 UNION 关键字时,它会处理每个子查询以形成临时结果表,然后组合每个子查询的临时结果表并删除重复行以形成组合结果表。 在对 SELECT 语句进行编码时,可以使用不同的子句和方法。
在合并从多个表中获取的值的列表时,可以使用 UNION 来消除重复项。 例如,您可以获取包含以下内容的员工编号的组合列表:
- 部门中的人员 D11
- 其分配包括项目 MA2112, MA2113和 AD3111 的人员
组合列表派生自两个表,并且不包含重复项。 为此,请指定:
SELECT EMPNO
FROM CORPDATA.EMPLOYEE
WHERE WORKDEPT = 'D11'
UNION
SELECT EMPNO
FROM CORPDATA.EMPPROJACT
WHERE PROJNO = 'MA2112' OR
PROJNO = 'MA2113' OR
PROJNO = 'AD3111'
ORDER BY EMPNO;
要更好地了解这些 SQL 语句的结果,请设想 SQL 执行以下过程:
步骤 1. SQL 处理第一个 SELECT 语句:
SELECT EMPNO
FROM CORPDATA.EMPLOYEE
WHERE WORKDEPT = 'D11';查询将返回以下临时结果表。
| 来自 CORPDATA.EMPLOYEE |
|---|
| 000060 |
| 000150 |
| 000160 |
| 000170 |
| 000180 |
| 000190 |
| 000200 |
| 000210 |
| 000220 |
| 200170 |
| 200220 |
第 2 步, SQL 处理第二个 SELECT 语句:
SELECT EMPNO
FROM CORPDATA.EMPPROJACT
WHERE PROJNO='MA2112' OR
PROJNO= 'MA2113' OR
PROJNO= 'AD3111';查询将返回另一个临时结果表。
| 来自 CORPDATA.EMPPROJACT |
|---|
| 000230 |
| 000230 |
| 000240 |
| 000230 |
| 000230 |
| 000240 |
| 000230 |
| 000150 |
| 000170 |
| 000190 |
| 000170 |
| 000190 |
| 000150 |
| 000160 |
| 000180 |
| 000170 |
| 000210 |
| 000210 |
第 3 步, SQL 将两个临时结果表组合在一起,除去重复行,并对结果进行排序:
SELECT EMPNO
FROM CORPDATA.EMPLOYEE
WHERE WORKDEPT = 'D11'
UNION
SELECT EMPNO
FROM CORPDATA.EMPPROJACT
WHERE PROJNO='MA2112' OR
PROJNO= 'MA2113' OR
PROJNO= 'AD3111'
ORDER BY EMPNO;查询将返回包含按升序排列的值的组合结果表。
| EMPNO |
|---|
| 000060 |
| 000150 |
| 000160 |
| 000170 |
| 000180 |
| 000190 |
| 000200 |
| 000210 |
| 000220 |
| 000230 |
| 000240 |
| 200170 |
| 200220 |
使用 UNION 时:
- 任何 ORDER BY 子句都必须出现在属于并集的最后一个子查询之后。 在此示例中,将根据第一个选定列 EMPNO对结果进行排序。 ORDER BY 子句指定组合结果表将按整理顺序排列。 视图中不允许 ORDER BY。
- 如果指定了结果列,那么可以在 ORDER BY 子句上指定名称。 如果每个已联合的 SELECT 语句中的相应列具有相同的名称,那么将命名结果列。 可以使用 AS 子句将名称分配给选择列表中的列。
SELECT A + B AS X ... UNION SELECT X ... ORDER BY X如果结果列未命名,请使用正整数对结果进行排序。 数字是指表达式在子选择中包含的表达式列表中的位置。SELECT A + B ... UNION SELECT X ... ORDER BY 1
要确定每行来自哪个子查询,可以在联合中每个子查询的选择列表末尾包含一个常量。 当 SQL 返回结果时,最后一列包含作为该行源的子查询的常量。 例如 ,您可指定:
SELECT A, B, 'A1' ...
UNION
SELECT X, Y, 'B2'...返回行时,它包含一个值 ( A1 或 B2) 以指示作为行值源的表。 如果并集中的列名不同,那么当交互式 SQL 显示或打印结果时,或者在处理 SQL DESCRIBE 语句所生成的 SQLDA 中, SQL 将使用第一个子查询中指定的列名集。
注: 在使 UNION 片段中的字段兼容之后,将应用排序顺序。 排序顺序用于 UNION 处理期间隐式发生的单值处理。