我最近实现了 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 处理数据集时会考虑重复行的数量。这导致返回表之间重复行的确切差异。正是max(0, x.N - y.N)。
另一个与 EXCEPT ALL 非常相似的棘手运算符是 INTERSECT ALL,它返回每个匹配行的 min(x.N, y.N) 重复项。
由于我提交的项目是开源的,我很高兴在这里提供一个链接:github.com/Rdatatable/data.table。如果您要寻找用于基准测试的工具,可能会很有用。 data.table 在内存中,主要是 C 实现的数据处理。它已经开源了大约 10 年。