使用 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 处理期间隐式发生的单值处理。