提要:在本教程中,您将学习如何使用 PostgreSQL 的 INTERSECT 运算符将多个查询的结果合并到一个结果集里。

PostgreSQL INTERSECT 简介

UNION(并集)EXCEPT(差集) 类似,INTERSECT(交集)也是用来将多个查询的结果合并到单个结果集里。INTERSECT 返回在所有表中都存在的记录。

以下是交集的示意图:

intersect

以下是 INTERSECT 的语法:

SELECT
 column_list
FROM
 A
INTERSECT
SELECT
 column_list
FROM
 B;

要使用 INTERSECT,需要遵循以下规则:

  • 字段的个数和顺序必须相同
  • 查询中的相应字段必须具有兼容的数据类型

PostgreSQL INTERSECT 示例

下面创建 employeeskeyshipos 表来进行演示:

CREATE TABLE employees (
 employee_id serial PRIMARY KEY,
 employee_name VARCHAR (255) NOT NULL
);

CREATE TABLE keys (
 employee_id INT PRIMARY KEY,
 effective_date DATE NOT NULL,
 FOREIGN KEY (employee_id) REFERENCES employees (employee_id)
);

CREATE TABLE hipos (
 employee_id INT PRIMARY KEY,
 effective_date DATE NOT NULL,
 FOREIGN KEY (employee_id) REFERENCES employees (employee_id)
);

employees 表存储雇员的主体信息;keys 表存储关键雇员;hipos 表存储高潜力和高影响力的雇员。下面,给这三张表插入一些示例数据:

INSERT INTO employees (employee_name)
VALUES
 ('Joyce Edwards'),
 ('Diane Collins'),
 ('Alice Stewart'),
 ('Julie Sanchez'),
 ('Heather Morris'),
 ('Teresa Rogers'),
 ('Doris Reed'),
 ('Gloria Cook'),
 ('Evelyn Morgan'),
 ('Jean Bell');

INSERT INTO keys
VALUES
 (1, '2000-02-01'),
 (2, '2001-06-01'),
 (5, '2002-01-01'),
 (7, '2005-06-01');

INSERT INTO hipos
VALUES
 (9, '2000-01-01'),
 (2, '2002-06-01'),
 (5, '2006-06-01'),
 (10, '2005-06-01');

看看有哪些关键雇员:

SELECT
 employee_id
FROM
 keys;
 employee_id
-------------
           1
           2
           5
           7
(4 rows)

看看有哪些潜力股:

SELECT
   employee_id
FROM hipos;
 employee_id
-------------
           9
           2
           5
          10
(4 rows)

看看哪些人既是关键雇员,又是潜力雇员:

SELECT
 employee_id
FROM
 keys
INTERSECT
SELECT
        employee_id
FROM
 hipos;
 employee_id
-------------
           5
           2
(2 rows)

通过 INTERSECT,我们查询出来了 ID 是 52 这两个既是关键的又是高潜力、高影响力的雇员。

要对合并后的结果集进行排序,可以在最后一个查询后面加上 ORDER BY——只在最后一个查询后面加,不是每个查询都加,如下所示:

SELECT
 employee_id
FROM
 keys
INTERSECT
SELECT
        employee_id
FROM
 hipos
ORDER BY employee_id;

结果:

 employee_id
-------------
           2
           5
(2 rows)

相关主题

上一篇:PostgreSQL的UNION
下一篇:PostgreSQL的差集