试图理解 sql 查询中的 "except all"

Trying to understand "except all" in sql query

我遇到了这个例子,但我不明白它是什么意思。

(SELECT drinker FROM Frequents)
     EXCEPT ALL
(SELECT drinker FROM Likes);

关系:常客(饮酒者、酒吧)、喜欢(饮酒者、啤酒)

在这种情况下,ALL 的作用是什么?结果与下面的查询有何不同?

(SELECT drinker FROM Frequents)
     EXCEPT
(SELECT drinker FROM Likes);

SQL EXCEPT 运算符获取一个查询的不同行和 returns 未出现在第二个结果集中的行。 EXCEPT ALL 运算符不删除重复项。出于行消除和重复删除的目的,EXCEPT 运算符不区分 NULL。

EXCEPT ALL 其中 returns 第一个 table 中不存在于第二个 table 中的所有记录,保留重复项。不幸的是,SQL 服务器不支持此运算符。

我最近实施了 INTERSECT ALLEXCEPT ALL,现在发现在 SO 上没有太多资源。


考虑以下数据的示例。

您可以在 sqlfiddle.com 上重现示例,使用 postgres 9.3。
请注意,大多数流行的数据库不支持 INTERSECT ALLEXCEPT ALL。使用 row_number() over () 的解决方法当然是可能的。

create table x (V1 numeric);
create table y (V1 numeric);
insert into x values (1),(2),(2),(2),(3),(4),(4);
insert into y values (2),(3),(4),(4),(4),(5);

EXCEPT [ALL] 匹配两个表中的所有列,列类型和顺序必须匹配。

select * from x except select * from y;
| v1
----
|  1

select * from x except all select * from y;
| v1
----
| 1
| 2
| 2

EXCEPT sql 中处理不同的数据集,因此任何重复项都会自动删除,每行只留下一个副本。这导致根据第二个数据集中的一行中的匹配排除一行。
另一方面,EXCEPT ALL 处理数据集时会考虑重复的行数。这导致 return 表之间重复行的确切差异。准确地说 max(0, x.N - y.N).

另一个棘手的运算符,非常类似于 EXCEPT ALLINTERSECT ALL,这个 returns min(x.N, y.N) 每个匹配行的副本。

由于我提交的项目是开源的,所以我很高兴在此处添加 link:github.com/Rdatatable/data.table。如果您要寻找用于基准测试的工具,可能会有用。 data.table 在内存中,主要是 C 实现的数据处理。它已经开源大约 10 年了。

except 运算符 returns 第一个 table 减去与第二个 table 的任何重叠。

集合 A = (10,11,12,10,10)

集合 B = (10,10)

A​​ except B --> (11,12)

A​​ 除所有 B --> (10,11,12)

except 从集合 A 中删除所有出现的重复数据,而 except all 仅从集合 A 中删除一次重复数据集合 B 中的每一次出现。