在 PostgreSQL 中使用 EXCEPT 子句

问题描述 投票:0回答:1

我正在尝试使用

EXCEPT
子句从表中检索数据。我想获取
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
的唯一方法似乎是从相同的表中选择或从不同的表中选择具有相同列名的列。

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

sql postgresql except
1个回答
12
投票

您的查询似乎完全有效:

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

Column names 与查询无关。您只需要相同数量的列,并且它们的数据类型必须匹配。查询的输出列名称是

fk_id_tbl2
,只是因为它是第一个
SELECT
中的列名称。您可以使用任何别名(在我的示例中为
some_name
)。

经常被忽视的是:

EXCEPT
(折叠重复项)和
EXCEPT ALL
(保留所有单独的不匹配行)之间的细微差别。如果一开始就没有受骗者,
EXCEPT ALL
是更好(更快)的选择。参见:

© www.soinside.com 2019 - 2024. All rights reserved.