九月 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 中比较两个表的方法。