SQL 查找两个表中相同的行

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 相匹配的全部员工的 EMPNOENAMEJOBSALDEPTNO,并且希望得到如下所示的结果集。

   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 来替代连接查询,并返回两个表的交集(相同的行)。
MySQLSQL 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 时,必须保证两个表里参与比较的项目数目是相同的,并且数据类型也是相同的。注意,当执行集合运算时,默认不会返回重复项。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程