如何编写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 );
逻辑解释
- 通过
INNER JOIN关联两张表中IdValue相同的记录,只保留有匹配条件的MyValues记录 - 按
MyValues的Id分组,统计每个Id对应的唯一IdValue数量 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 ) );
逻辑解释
- 外层查询
MyValues的所有唯一Id - 内层第一个
NOT EXISTS检查:是否存在MyConditions中的某个IdValue,是当前Id在MyValues中没有的 - 如果不存在这样的
IdValue,则说明该Id完全覆盖了所有条件值,被筛选出来
内容的提问来源于stack exchange,提问作者user441365
相关产品推荐
相关产品推荐

