如何实现两个SELECT查询结果集的超集运算?
判断两个查询结果集的超集关系
核心逻辑
超集的定义很直接:若集合X的所有元素都包含在集合Y中,那么Y就是X的超集。我们可以通过SQL的NOT EXISTS语句验证两个结果集的双向包含关系,以此确定超集关系。
验证第一个查询结果是否为第二个的超集
执行以下语句,检查第二个查询的结果是否全部存在于第一个查询中:
-- 统计第二个查询中不在第一个查询里的记录数 SELECT COUNT(*) FROM ( SELECT field2 AS common_field FROM tbl2 WHERE conditionsy ) AS set_b WHERE NOT EXISTS ( SELECT 1 FROM ( SELECT field1 AS common_field FROM tbl1 WHERE conditionsx ) AS set_a WHERE set_a.common_field = set_b.common_field );
- 若返回
0:说明第二个查询的所有记录都在第一个查询中,第一个结果集是第二个的超集。 - 若返回大于
0:说明第二个查询存在第一个查询没有的记录,第一个结果集不是第二个的超集。
验证第二个查询结果是否为第一个的超集
同理,检查第一个查询的结果是否全部存在于第二个查询中:
-- 统计第一个查询中不在第二个查询里的记录数 SELECT COUNT(*) FROM ( SELECT field1 AS common_field FROM tbl1 WHERE conditionsx ) AS set_a WHERE NOT EXISTS ( SELECT 1 FROM ( SELECT field2 AS common_field FROM tbl2 WHERE conditionsy ) AS set_b WHERE set_b.common_field = set_a.common_field );
- 若返回
0:说明第一个查询的所有记录都在第二个查询中,第二个结果集是第一个的超集。 - 若返回大于
0:说明第一个查询存在第二个查询没有的记录,第二个结果集不是第一个的超集。
最终关系判断
结合两次验证的结果,就能确定超集关系:
- 第一个验证返回
0,第二个返回非0→ 第一个结果集是第二个的超集 - 第二个验证返回
0,第一个返回非0→ 第二个结果集是第一个的超集 - 两次验证都返回
0→ 两个结果集完全相等(互为超集) - 两次验证都返回非
0→ 两者无超集关系
内容的提问来源于stack exchange,提问作者parmer_110
相关产品推荐
相关产品推荐

