九月 15, 2023
摘要:在本教程中,您将学习在 PostgreSQL 中比较两个表的各种方法。
目录
有多种方法可以比较两个表的内容以找出它们之间的差异。我们将向您展示两种常用的技术来比较两个表的数据。
使用 EXCEPT 和 UNION 运算符比较两个表
首先,我们创建两个表,名为foo和bar,并插入一些示例数据以进行演示。
CREATE TABLE foo (
ID INT PRIMARY KEY,
NAME VARCHAR (50)
);
INSERT INTO foo (ID, NAME)
VALUES
(1, 'a'),
(2, 'b');
CREATE TABLE bar (
ID INT PRIMARY KEY,
NAME VARCHAR (50)
);
INSERT INTO bar (ID, NAME)
VALUES
(1, 'a'),
(2, 'b');
foo表具有与bar表相同的结构和数据。
接下来,我们更新bar表中的一行。
UPDATE bar
SET name = 'c'
WHERE
id = 2;

然后,要查找foo表中但不在bar表中的行,我们使用以下查询:
SELECT
ID,
NAME,
'not in bar' AS note
FROM
foo
EXCEPT
SELECT
ID,
NAME,
'not in bar' AS note
FROM
bar

我们使用EXCEPT运算符返回在foo表中存在,但不在bar表中存在的行。我们可以应用相同的技术来查找bar表中但不在foo表中的行。
SELECT
ID,
NAME,
'not in foo' AS note
FROM
bar
EXCEPT
SELECT
ID,
NAME,
'not in foo' AS note
FROM
foo

最后,我们使用 UNION 运算符将两个查询的结果组合起来找到:
- 在
bar表中存在,但在foo表中不存在的行。 - 在
foo表中存在,但在bar表中不存在的行。

使用 OUTER JOIN 比较两个表
我们可以使用外连接来比较两个表,如下所示:
SELECT
id,
name
FROM
foo
FULL OUTER JOIN bar USING (id, name)
WHERE
foo.id IS NULL
OR bar.id IS NULL;
它返回两个表之间的差异:

要查找foo表中存在而不在bar表中的行数,反之亦然,我们使用 COUNT 函数,如下所示:
SELECT
COUNT (*)
FROM
foo
FULL OUTER JOIN bar USING (id, name)
WHERE
foo.id IS NULL
OR bar.id IS NULL;

在本教程中,我们向您展示了两种在 PostgreSQL 中比较两个表的方法。