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

标签 sql postgresql

我有一个结果集 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 BAB 中找到它们。我可以用 A EXCEPT B 找到 Anot 中的所有行。

这让我想到了一个问题,如何找到 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/

相关文章:

mysql - 我如何在 MySQL 中处理这样的查询,也许是 Group_Concat?

entity-framework - 使用 Npgsql 生成 EntityFramework 时出错

sql - 按天而不是时间对时间戳进行分组

postgresql - 如何在 where 子句中使用 sum 来计算平均值

sql - 嵌套自连接并创建多个总和

c# - 如何使用声明感知用户名/登录授权为我的 WCF 服务创建本地 STS?

SQL 查询 : concatenate many columns of string type in one

php - 检查哪些名称在数据库中具有相同的字段

mysql - sql sum 和 group 通过给多行

mysql - sql查询从单个表中获取标签信息