SQL 查找两个表中相同的行,你想找出两个表中相同的行,但需要连接多列。
SQL 查找两个表中相同的行 问题描述
你想找出两个表中相同的行,但需要连接多列。例如,考虑如下所示的视图 V。
create view V
as
select ename,job,sal
from emp
where job = 'CLERK'
select * from V
ENAME JOB SAL
---------- --------- ----------
SMITH CLERK 800
ADAMS CLERK 1100
JAMES CLERK 950
MILLER CLERK 1300
视图 V 只包含职位是 CLERK 的员工,但并没有显示 EMP 表中所有可能的列。你想从 EMP 表获取与视图 V 相匹配的全部员工的 EMPNO、ENAME、JOB、SAL 和 DEPTNO,并且希望得到如下所示的结果集。
EMPNO ENAME JOB SAL DEPTNO
-------- ---------- --------- ---------- ----------
7369 SMITH CLERK 800 20
7876 ADAMS CLERK 1100 20
7900 JAMES CLERK 950 30
7934 MILLER CLERK 1300 10
SQL 查找两个表中相同的行 解决方案
把多个表中所有必要的列都连接起来,以获得正确的结果。也可以使用集合运算 INTERSECT 来替代连接查询,并返回两个表的交集(相同的行)。
MySQL 和 SQL Server
使用多个条件把 EMP 表和视图 V 连接起来。
1 select e.empno,e.ename,e.job,e.sal,e.deptno
2 from emp e, V
3 where e.ename = v.ename
4 and e.job = v.job
5 and e.sal = v.sal
除此之外,也可以使用 JOIN 子句执行同样的连接查询。
1 select e.empno,e.ename,e.job,e.sal,e.deptno
2 from emp e join V
3 on ( e.ename = v.ename
4 and e.job = v.job
5 and e.sal = v.sal )
DB2、Oracle 和 PostgreSQL
针对 MySQL 和 SQL Server 的解决方案也适用于 DB2、Oracle 和 PostgreSQL。如果你希望从视图 V 查询数据,就需要使用该方案。
如果你不需要检索视图 V 的某些列,可以使用集合运算 INTERSECT 和谓词 IN。
1 select empno,ename,job,sal,deptno
2 from emp
3 where (ename,job,sal) in (
4 select ename,job,sal from emp
5 intersect
6 select ename,job,sal from V
7 )
SQL 查找两个表中相同的行 扩展知识
当执行连接查询时,为了得到正确的结果,必须慎重考虑要把哪些列作为连接项。当参与连接的行集里的某些列可能有共同值,而其他列有不同值的时候,这一点尤为重要。
集合运算 INTERSECT 会返回两个行集的相同部分。在使用 INTERSECT 时,必须保证两个表里参与比较的项目数目是相同的,并且数据类型也是相同的。注意,当执行集合运算时,默认不会返回重复项。
极客教程