我遇到了这个例子,我不明白它是什么意思。
(SELECT drinker FROM Frequents)
EXCEPT ALL
(SELECT drinker FROM Likes);
关系:Frequents(饮酒者,酒吧),Likes(饮酒者,啤酒)
在这种情况下 ALL 会做什么?结果与下面的查询有何不同?
(SELECT drinker FROM Frequents)
EXCEPT
(SELECT drinker FROM Likes);
我遇到了这个例子,我不明白它是什么意思。
(SELECT drinker FROM Frequents)
EXCEPT ALL
(SELECT drinker FROM Likes);
关系:Frequents(饮酒者,酒吧),Likes(饮酒者,啤酒)
在这种情况下 ALL 会做什么?结果与下面的查询有何不同?
(SELECT drinker FROM Frequents)
EXCEPT
(SELECT drinker FROM Likes);
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);
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 年。
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 中删除一次重复数据。