10

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

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

关系:Frequents(饮酒者,酒吧),Likes(饮酒者,啤酒)

在这种情况下 ALL 会做什么?结果与下面的查询有何不同?

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

3 回答 3

10

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

EXCEPT ALL 返回第一个表中不存在于第二个表中的所有记录,保留重复项。不幸的是,SQL Server 不支持此运算符。

于 2015-02-10T13:24:26.430 回答
3

我最近实现了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 中处理不同的数据集,因此任何重复项都会被自动删除,只留下每行的一个副本。这会导致基于第二个数据集中的一行中的匹配排除一行。
另一方面,除了考虑重复行数量的所有流程数据集。这导致返回表之间重复行的确切差异。准确地说max(0, x.N - y.N)

另一个与EXCEPT ALL非常相似的棘手运算符是INTERSECT ALL,它返回min(x.N, y.N)每个匹配行的重复项。

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

于 2016-03-08T00:55:01.507 回答
3

except 运算符返回第一个表减去与第二个表的任何重叠。

设置 A = (10,11,12,10,10)

设置 B = (10,10)

A除外B --> (11,12)

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

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

于 2020-08-23T08:26:25.543 回答