在 PostgreSQL 中使用 EXCEPT 子句

Using EXCEPT clause in PostgreSQL

我正在尝试使用 EXCEPT 子句从 table 检索数据。我想从 table1 中获取所有行,但 table2 中存在的行除外。 据我了解,以下内容不起作用:

CREATE TABLE table1(pk_id int, fk_id_tbl2 int);
CREATE TABLE table2(pk_id int);

Select fk_id_tbl2
FROM table1
Except
Select pk_id
FROM table2

我可以使用 EXCEPT 的唯一方法似乎是 select 来自相同的 table 或 select 具有相同列名的列来自不同的 tables.

有人可以解释一下如何最好地使用解释子句吗?

您的查询似乎完全有效:

SELECT fk_id_tbl2 AS some_name
FROM   table1
EXCEPT  -- you may want to use EXCEPT ALL
SELECT pk_id
FROM   table2;

名称与查询无关。只有数据类型必须匹配。您查询的输出列名是 fk_id_tbl2,只是因为它是第一个 SELECT 中的列名。您可以使用任何别名。

经常被忽视的是:EXCEPT(折叠重复项)和 EXCEPT ALL 之间的细微差别 - 保留所有单独的不匹配行。 更多解释和其他方法,其中一些更灵活:

  • Select rows which are not present in other table

Details for EXCEPT in the manual.