使用 INTERSECT 关键字

InterSECT 关键字返回由两个结果集中存在的所有行组成的组合结果集。

假设您要查找包含部门 D11 中人员的员工编号列表,这些人员的分配包括项目 MA2112, MA2113和 AD3111。

InterSECT 操作将返回这两个结果集中存在的所有员工编号。 换言之,此查询将返回部门 D11 中同时处理项目 MA2112, MA2113和 AD3111:

SELECT EMPNO
   FROM CORPDATA.EMPLOYEE
   WHERE WORKDEPT = 'D11'
 INTERSECT
 SELECT EMPNO
   FROM CORPDATA.EMPPROJACT
   WHERE PROJNO = 'MA2112' OR
      PROJNO = 'MA2113' OR
      PROJNO = 'AD3111'
 ORDER BY EMPNO;

要更好地了解这些 SQL 语句的结果,请设想 SQL 执行以下过程:

步骤 1. SQL 处理第一个 SELECT 语句:

SELECT EMPNO
     FROM CORPDATA.EMPLOYEE
     WHERE WORKDEPT = 'D11';

此查询返回临时结果表。

来自 CORPDATA.EMPLOYEE
000060
000150
000160
000170
000180
000190
000200
000210
000220
200170
200220

第 2 步, SQL 处理第二个 SELECT 语句:

SELECT EMPNO
     FROM CORPDATA.EMPPROJACT
     WHERE PROJNO='MA2112' OR
                 PROJNO= 'MA2113' OR
                 PROJNO= 'AD3111';

此查询将返回另一个临时结果表。

来自 CORPDATA.EMPPROJACT
000230
000230
000240
000230
000230
000240
000230
000150
000170
000190
000170
000190
000150
000160
000180
000170
000210
000210

第 3 步, SQL 采用第一个临时结果表,将其与第二个临时结果表进行比较,并返回两个表中存在的行减去任何重复行,然后对结果进行排序。

SELECT EMPNO 
     FROM CORPDATA.EMPLOYEE
     WHERE WORKDEPT = 'D11'
INTERSECT
SELECT EMPNO 
     FROM CORPDATA.EMPPROJACT
     WHERE PROJNO='MA2112' OR
                 PROJNO= 'MA2113' OR
                 PROJNO= 'AD3111'
ORDER BY EMPNO;

此查询返回包含按升序排列的值的组合结果表。

EMPNO
000150
000160
000170
000180
000190
000210