PostgreSQL 教程: 比较两个表

九月 15, 2023

摘要:在本教程中,您将学习在 PostgreSQL 中比较两个表的各种方法。

有多种方法可以比较两个表的内容以找出它们之间的差异。我们将向您展示两种常用的技术来比较两个表的数据。

使用 EXCEPT 和 UNION 运算符比较两个表

首先,我们创建两个表,名为foobar,并插入一些示例数据以进行演示。

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;

compare-two-tables-postgresql

然后,要查找foo表中但不在bar表中的行,我们使用以下查询

SELECT
	ID,
	NAME,
	'not in bar' AS note
FROM
	foo
EXCEPT
	SELECT
		ID,
		NAME,
		'not in bar' AS note
	FROM
		bar

postgresql compare two tables: not in bar table

我们使用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

compare two tables not in foo table

最后,我们使用 UNION 运算符将两个查询的结果组合起来找到:

  • bar表中存在,但在foo表中不存在的行。
  • foo表中存在,但在bar表中不存在的行。

compare two tables: result

使用 OUTER JOIN 比较两个表

我们可以使用外连接来比较两个表,如下所示:

SELECT
	id,
	name
FROM
	foo
FULL OUTER JOIN bar USING (id, name)
WHERE
	foo.id IS NULL
OR bar.id IS NULL;

它返回两个表之间的差异:

postgresql compare two tables differences

要查找foo表中存在而不在bar表中的行数,反之亦然,我们使用 COUNT 函数,如下所示:

SELECT
	COUNT (*)
FROM
	foo
FULL OUTER JOIN bar USING (id, name)
WHERE
	foo.id IS NULL
OR bar.id IS NULL;

number of rows differences

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