SQL 叠加两个行集,你想返回保存在多个表中的数据,理论上需要将一个结果集叠加在另一个之上。这些表可以没有相同的键,但它们的列的数据类型必须相同。例如,你想显示 EMP 表里部门编号为 10 的员工的名字和部门编号,以及 DEPT 表中各个部门的名称和编号。你希望得到如下所示的结果集。
SQL 叠加两个行集 问题描述
你想返回保存在多个表中的数据,理论上需要将一个结果集叠加在另一个之上。这些表可以没有相同的键,但它们的列的数据类型必须相同。例如,你想显示 EMP 表里部门编号为 10 的员工的名字和部门编号,以及 DEPT 表中各个部门的名称和编号。你希望得到如下所示的结果集。
ENAME_AND_DNAME DEPTNO
--------------- ----------
CLARK 10
KING 10
MILLER 10
----------
ACCOUNTING 10
RESEARCH 20
SALES 30
OPERATIONS 40
SQL 叠加两个行集 解决方案
使用集合运算 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
SQL 叠加两个行集 扩展知识
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。
极客教程