描述:
你想返回保存在多个表中的数据,理论上需要将一个结果集叠加在另一个之上。这些表可以没有相同的键,但它们的列的数据类型必须相同。例如,你想显示 EMP
表里部门编号为 10
的员工的名字和部门编号,以及 DEPT
表中各个部门的名称和编号。你希望得到如下所示的结果集。
ENAME_AND_DNAME DEPTNO
--------------- ----------
CLARK 10
KING 10
MILLER 10
----------
ACCOUNTING 10
RESEARCH 20
SALES 30
OPERATIONS 40
方法:
使用集合运算 UNION ALL
合并多个表中的行。
select ename as ename_and_dname, deptno
from emp
where deptno = 10
union all
select '----------', null
from t1
union all
select dname, deptno
from dept
扩展知识:
UNION ALL
将多个表中的行并入一个结果集。对于所有的集合运算来说,SELECT
列表里的所有项目必须保持数目相同,且数据类型匹配。例如,下面的两个检索都将失败。
select deptno | select deptno, dname
from dept | from dept
union all | union
select ename | select deptno
from emp | from emp
尤其需要注意的是,如果有重复项,UNION ALL
也将一并纳入。如果你希望过滤掉重复项,可以使用 UNION
运算符。例如,如果针对 EMP.DEPTNO
和 DEPT.DEPTNO
执行 UNION
操作,就只会返回如下所示的 4 行数据。
select deptno
from emp
union
select deptno
from dept
运行结果:
DEPTNO
----------
10
20
30
40
使用 UNION
而不是 UNION ALL
,则很可能会进行一次排序操作,以便删除重复项。当处理大型结果集的时候要想到这一点。大体而言,使用 UNION
等同于针对 UNION ALL
的输出结果再执行一次 DISTINCT
操作,如下所示。
select distinct deptno
from (
select deptno
from emp
union all
select deptno
from dept )
运行结果:
DEPTNO
----------
10
20
30
40
除非有必要,否则不要在查询中使用 DISTINCT
操作,同样的规则也适用于 UNION
。除非有必要,否则不要用 UNION
代替 UNION ALL
。