sql求非去重对称差集
时间: 2025-02-22 17:20:57 浏览: 38
### 如何在 SQL 中实现不去重的两个表的对称差集
为了实现在 SQL 中计算两个表之间的非去重对称差集,可以采用 `UNION ALL` 和 `NOT EXISTS` 的组合来保留所有符合条件的记录。具体来说:
对于两个表 A 和 B 来说,可以通过以下方式获取它们之间不消除重复项的对称差集。
#### 表A相对于表B的部分
```sql
SELECT *
FROM Product p1
WHERE NOT EXISTS (
SELECT 1
FROM Product2 p2
WHERE p2.product_id = p1.product_id AND p2.other_column = p1.other_column -- 如果有更多列用于比较则继续添加条件
);
```
这段代码会返回存在于表Product但是不存在于表Product2中的全部行数据,即使存在多个相同的product_id也会被一并选出[^1]。
#### 表B相对于表A的部分
同样地,
```sql
SELECT *
FROM Product2 p2
WHERE NOT EXISTS (
SELECT 1
FROM Product p1
WHERE p1.product_id = p2.product_id AND p1.other_column = p2.other_column -- 同样如果有更多的匹配字段也应加入到这里的ON语句中
);
```
这将给出只出现在第二个表格而不在第一个表格里的条目列表,并保持任何可能存在的副本不变。
最后一步就是把上面两部分的结果结合起来形成完整的对称差异结果集:
```sql
WITH Part_A AS(
SELECT *
FROM Product p1
WHERE NOT EXISTS (
SELECT 1
FROM Product2 p2
WHERE p2.product_id = p1.product_id AND p2.other_column = p1.other_column
)
),
Part_B AS(
SELECT *
FROM Product2 p2
WHERE NOT EXISTS (
SELECT 1
FROM Product p1
WHERE p1.product_id = p2.product_id AND p1.other_column = p2.other_column
)
)
SELECT * FROM Part_A
UNION ALL
SELECT * FROM Part_B;
```
通过这种方式,在最终得到的数据集中既包含了来自任一侧独有的项目同时也维持了原始输入中存在的冗余情况。
阅读全文
相关推荐





