use*_*159 7 sql set-difference set-operations intersect set-intersection
我遇到了这个例子,我不明白这意味着什么.
(SELECT drinker FROM Frequents)
EXCEPT ALL
(SELECT drinker FROM Likes);
Run Code Online (Sandbox Code Playgroud)
关系:频繁(饮酒者,酒吧),喜欢(饮酒者,啤酒)
在这种情况下,ALL会做什么?结果与下面的查询有何不同?
(SELECT drinker FROM Frequents)
EXCEPT
(SELECT drinker FROM Likes);
Run Code Online (Sandbox Code Playgroud)
小智 13
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 中删除一次重复数据。
SQL EXCEPT运算符采用一个查询的不同行,并返回未出现在第二个结果集中的行。EXCEPT ALL运算符不会删除重复项。出于行消除和重复删除的目的,EXCEPT运算符不区分NULL。
EXCEPT ALL会返回第一个表中所有不存在于第二个表中的记录,而重复项保持原样。不幸的是,SQL Server不支持该运算符。
我最近实现了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);
Run Code Online (Sandbox Code Playgroud)
除了 [ALL]匹配两个表中的所有列之外,列类型和顺序必须匹配。
select * from x except select * from y;
| v1
----
| 1
select * from x except all select * from y;
| v1
----
| 1
| 2
| 2
Run Code Online (Sandbox Code Playgroud)
在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 年了。