Oracle SQL分组并比较子集:筛选包含指定ID所有值的ID
解决Oracle SQL筛选包含指定ID所有VALUE的ID需求
嘿,这个需求我很熟悉,咱们来一步步搞定它!首先明确下核心需求:我们要从给定的数据表中,找出那些**完全包含ID=1所有VALUE值(也就是同时包含A和B)**的ID——不管这些ID还有没有其他额外的VALUE,只要覆盖了ID=1的全部VALUE就算符合条件,预期结果是ID:1、2、4。
下面给你两种实用的Oracle SQL实现方案:
方案一:使用CTE+分组统计
这种方法先提取ID=1的所有VALUE集合,再通过分组统计匹配数量来筛选:
WITH id1_required_values AS ( SELECT VALUE FROM your_table WHERE ID = 1 ) SELECT t.ID FROM your_table t JOIN id1_required_values iv ON t.VALUE = iv.VALUE GROUP BY t.ID HAVING COUNT(DISTINCT t.VALUE) = (SELECT COUNT(DISTINCT VALUE) FROM id1_required_values);
逻辑解释:
- 用CTE
id1_required_values先获取ID=1对应的所有唯一VALUE(这里是A和B) - 将原表与这个CTE关联,只保留那些VALUE属于ID=1集合的记录
- 按ID分组后,统计每个ID匹配到的不同VALUE数量
- 当统计数量等于ID=1的VALUE总数时,说明该ID完全包含了ID=1的所有VALUE,符合筛选条件
方案二:使用双重NOT EXISTS
这种方法通过嵌套的NOT EXISTS来做反向验证:当前ID不存在任何ID=1拥有的VALUE,也就是当前ID包含了ID=1的全部VALUE:
SELECT DISTINCT t.ID FROM your_table t WHERE NOT EXISTS ( -- 检查是否存在ID=1的某个VALUE,当前ID没有 SELECT 1 FROM your_table t1 WHERE t1.ID = 1 AND NOT EXISTS ( -- 检查当前ID是否包含这个VALUE SELECT 1 FROM your_table t2 WHERE t2.ID = t.ID AND t2.VALUE = t1.VALUE ) );
逻辑解释:
内层的NOT EXISTS会检查“ID=1的某个VALUE,当前ID t.ID是否没有”,如果外层的NOT EXISTS成立,说明不存在这样的VALUE——也就是当前ID包含了ID=1的所有VALUE,符合要求。
这两种方案都能得到预期的结果:ID=1、2、4,你可以根据自己的习惯选择使用。
内容的提问来源于stack exchange,提问作者Jayan Vidanapathirana
相关产品推荐
相关产品推荐

