SQL规范是否提供了更好的方法来对两个集进行异或运算?

Eva*_*oll 4 sql postgresql

我有一个A10行1-10 的结果集{1,2,3,4,5,6,7,8,9,10},B其中10行由evens 1-20组成{2,4,6,8,10,12,14,16,18,20}.我想找到一组中的元素,但不是两者.行中没有其他列.

我知道UNION会有A + B.我可以在两地的人A,并BA INTERSECT B.我能找到的所有的行A不是在B带A EXCEPT B.

这让我想到如何找到A或B中的所有行,但不是两者都有,( A EXCEPT B ) UNION ( B EXCEPT A)在sql规范中是否存在传递等价?我想要一套{1,3,5,7,9,12,14,16,18,20}.我相信这也可以写A UNION B EXCEPT ( A INTERSECT B )

在集合理论中,为什么在一次操作中无法做到这一点(可以向不理解集合理论的人解释),是否有一个拙劣的理由?或者,它是否只是没有实现,因为它自己构建起来如此简单?或者,我不知道更好的方法吗?

我认为这必须在某个地方的SQL规范中:我知道这个东西是巨大的.

Mar*_*ers 6

还有另一种方法可以做你想要的,使用带有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
Run Code Online (Sandbox Code Playgroud)