试图理解 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 ALL 和 EXCEPT ALL,现在发现在 SO 上没有太多资源。
考虑以下数据的示例。
您可以在 sqlfiddle.com 上重现示例,使用 postgres 9.3。
请注意,大多数流行的数据库不支持 INTERSECT ALL 和 EXCEPT 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 ALL 是 INTERSECT 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 中的每一次出现。
我遇到了这个例子,但我不明白它是什么意思。
(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 ALL 和 EXCEPT ALL,现在发现在 SO 上没有太多资源。
考虑以下数据的示例。
您可以在 sqlfiddle.com 上重现示例,使用 postgres 9.3。
请注意,大多数流行的数据库不支持 INTERSECT ALL 和 EXCEPT 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 ALL 是 INTERSECT 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 中的每一次出现。