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

如何编写SQL查询获取匹配所有MyConditions记录的MyValues表Id?

匹配所有条件值的SQL查询方法

需求说明

从MyValues表中筛选出符合以下要求的Id:该Id对应的所有IdValue必须完全覆盖MyConditions表中的全部IdValue记录。根据给出的数据,预期结果为1(仅Id=1的记录包含了条件表中的10和11两个值)。

方法一:分组计数匹配

这种方法通过统计分组后的IdValue数量,与条件表的总条件数对比来筛选:

SELECT mv.Id
FROM MyValues mv
INNER JOIN MyConditions mc 
    ON mv.IdValue = mc.IdValue
GROUP BY mv.Id
HAVING COUNT(DISTINCT mv.IdValue) = (
    SELECT COUNT(DISTINCT IdValue) 
    FROM MyConditions
);

逻辑解释

  1. 通过INNER JOIN关联两张表中IdValue相同的记录,只保留有匹配条件的MyValues记录
  2. 按MyValues的Id分组,统计每个Id对应的唯一IdValue数量
  3. HAVING子句中,将分组统计的数量与MyConditions表中唯一IdValue的总数对比,相等则说明该Id包含了所有条件值

方法二:双层NOT EXISTS校验

这种方法通过反向校验,确保不存在条件表中未被当前Id覆盖的IdValue:

SELECT DISTINCT mv.Id
FROM MyValues mv
WHERE NOT EXISTS (
    -- 检查是否存在条件表中的IdValue未被当前Id覆盖
    SELECT 1
    FROM MyConditions mc
    WHERE NOT EXISTS (
        SELECT 1
        FROM MyValues mv2
        WHERE mv2.Id = mv.Id 
          AND mv2.IdValue = mc.IdValue
    )
);

逻辑解释

  1. 外层查询MyValues的所有唯一Id
  2. 内层第一个NOT EXISTS检查:是否存在MyConditions中的某个IdValue,是当前Id在MyValues中没有的
  3. 如果不存在这样的IdValue,则说明该Id完全覆盖了所有条件值,被筛选出来

内容的提问来源于stack exchange,提问作者user441365

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 16:20:05