我有一个结果集 A
,它有 10 行 1-10 {1,2,3,4,5,6,7,8,9,10}
和 B
,它是 10 行,由偶数 1-20 {2,4,6,8,10,12,14,16,18,20}
组成。我想找到一组中的元素,而不是两者中的元素。行中没有其他列。
我知道 UNION
将是 A + B
。我可以通过 A INTERSECT B
在 A
和 B
中找到它们。我可以用 A EXCEPT B
找到 A
中 not 中的所有行。
这让我想到了一个问题,如何找到 A 或 B 中的所有行,但不是两者,是否有 ( A EXCEPT B ) UNION ( B SQL 规范中的 A)
除外?我想要一组 {1,3,5,7,9,12,14,16,18,20}
。我相信这也可以写成 A UNION B EXCEPT ( A INTERSECT B )
集合论中是否有数学上的原因说明为什么这不能在一次操作中完成(可以向不了解集合论的人解释)?或者,它只是没有实现,因为它很容易自己构建?或者,我只是不知道有更好的方法吗?
我认为这必须在某处的 SQL 规范中:我知道这东西很庞大。
最佳答案
还有另一种方法可以完成您想要的操作,即使用带有 WHERE 子句的 FULL OUTER JOIN 来删除出现在两个表中的行。这可能比您建议的构造更有效,但您当然应该测量两者的性能以确保。您可以使用以下查询:
SELECT COALESCE(A.id, B.id) AS id
FROM A
FULL OUTER JOIN B
ON A.id = B.id
WHERE A.id IS NULL OR B.id IS NULL
关于sql - SQL 规范是否提供了一种更好的方法来对两个集合进行异或运算?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2188100/