You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:58:15