描述:
你想找出两个表中相同的行,但需要连接多列。例如,考虑如下所示的视图 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
,并且希望得到如下所示的结果集。
方法:
把多个表中所有必要的列都连接起来,以获得正确的结果。也可以使用集合运算 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 )
扩展知识:
当执行连接查询时,为了得到正确的结果,必须慎重考虑要把哪些列作为连接项。当参与连接的行集里的某些列可能有共同值,而其他列有不同值的时候,这一点尤为重要。
集合运算 INTERSECT
会返回两个行集的相同部分。在使用 INTERSECT
时,必须保证两个表里参与比较的项目数目是相同的,并且数据类型也是相同的。注意,当执行集合运算时,默认不会返回重复项。