SQL 合并相关行,你想根据一个共同的列或者具有相同值的列做连接查询,并返回多个表中的行。例如,你想显示部门编号为 10 的全部员工的名字及其部门所在地,但这些数据分别存储在两个表里。你希望得到如下所示的结果集。
SQL 合并相关行 问题描述
ENAME LOC
---------- -------------
CLARK NEW YORK
KING NEW YORK
MILLER NEW YORK
SQL 合并相关行 解决方案
通过 DEPTNO
字段把 EMP
表和 DEPT
表连接起来。
1 select e.ename, d.loc
2 from emp e, dept d
3 where e.deptno = d.deptno
4 and e.deptno = 10
SQL 合并相关行 扩展知识
这个解决方案是一个关于连接查询的例子。更准确地说,它是内连接中的相等连接。连接查询是一种把来自两个表的行合并起来的操作。对于相等连接而言,其连接条件依赖于某个相等条件(例如,一个表的部门编号和另一个表的部门编号相等)。内连接是最早的一种连接,它返回的每一行都包含了来自参与连接查询的各个表的数据。
理论上,连接操作首先会依据 FROM
子句里列出的表生成笛卡儿积(列出所有可能的行组合),如下所示。
select e.ename, d.loc,
e.deptno as emp_deptno,
d.deptno as dept_deptno
from emp e, dept d
where e.deptno = 10
ENAME LOC EMP_DEPTNO DEPT_DEPTNO
---------- ------------- ---------- -----------
CLARK NEW YORK 10 10
KING NEW YORK 10 10
MILLER NEW YORK 10 10
CLARK DALLAS 10 20
KING DALLAS 10 20
MILLER DALLAS 10 20
CLARK CHICAGO 10 30
KING CHICAGO 10 30
MILLER CHICAGO 10 30
EMP
表里部门编号为 10 的全部员工与 DEPT
表的所有部门组合都被列出来了。然后,通过 WHERE
子句里的 e.deptno
和 d.deptno
做连接操作,限定了只有 EMP.DEPTNO
和 DEPT.DEPTNO
相等的行才会被返回。
select e.ename, d.loc,
e.deptno as emp_deptno,
d.deptno as dept_deptno
from emp e, dept d
where e.deptno = d.deptno
and e.deptno = 10
ENAME LOC EMP_DEPTNO DEPT_DEPTNO
---------- ------------- ---------- -----------
CLARK NEW YORK 10 10
KING NEW YORK 10 10
MILLER NEW YORK 10 10
另一种写法是利用显式的 JOIN
子句(INNER
关键字是可选项)。
select e.ename, d.loc
from emp e inner join dept d
on (e.deptno = d.deptno)
where e.deptno = 10
如果你更喜欢在 FROM
子句里(而不是在 WHERE
子句里)写明连接逻辑,则可以使用 JOIN
子句。这两种风格都符合 ANSI 标准,本书涉及的关系数据库管理系统的最新版本也都支持它们。