【问题标题】:Trying to understand "except all" in sql query试图理解sql查询中的“全部除外”
【发布时间】:2015-04-10 13:08:00
【问题描述】:

我遇到了这个例子,但我不明白它的含义。

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

关系:频繁(饮酒者、酒吧)、喜欢(饮酒者、啤酒)

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

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

【问题讨论】:

标签: sql intersect set-intersection set-difference set-operations


【解决方案1】:

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

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

【讨论】:

  • rextester.com 上尝试了一些查询。我没有发现任何 MySQL、Oracle、MS SQL Server 或 postgres 支持 EXCEPT ALL。它存在于哪个数据库引擎中? (仅 SQL Server 支持EXCEPT
【解决方案2】:

我最近实现了 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 处理数据集时会考虑重复行的数量。这导致返回表之间重复行的确切差异。正是max(0, x.N - y.N)

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

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

【讨论】:

  • rextester.com 上尝试了一些查询。我没有发现任何 MySQL、Oracle、MS SQL Server 或 postgres 支持 EXCEPT ALL。它存在于哪个数据库引擎中? (仅 SQL Server 支持EXCEPT
  • @anir 根据文档,除了所有已经在 postgres 中超过 10 年。
【解决方案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 中删除一个重复数据。 p>

【讨论】:

    猜你喜欢
    • 2021-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-10
    • 2010-12-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多