SQL Server分组查询:筛选包含指定天数列表的PriceCardId
筛选包含指定Days集合的PriceCardId(SQL Server)
这是个典型的集合包含验证需求,针对你的数据表和要求,我提供两种实用的SQL查询方案,都能准确得到预期结果:
方案一:GROUP BY + HAVING 统计法
这种方法通过分组统计来验证是否包含所有指定Days值,效率较高,适合目标列表元素较多的场景:
SELECT PriceCardId FROM YourTableName -- 替换成你的实际表名 WHERE Days IN (2, 4, 5, 6) GROUP BY PriceCardId HAVING COUNT(DISTINCT Days) = 4 -- 4对应指定列表的元素总数
逻辑说明:
- 先用
WHERE Days IN (...)筛选出所有属于目标列表的记录 - 按
PriceCardId分组,统计每组中不同Days的数量 - 只有当统计数量等于目标列表的元素总数时,说明该
PriceCardId包含了所有指定的Days值,没有遗漏
方案二:多EXISTS验证法
这种方法逻辑更直观,逐一验证每个目标Days是否存在于对应PriceCardId的记录中,适合目标列表元素较少的场景:
SELECT DISTINCT PriceCardId FROM YourTableName pc -- 替换成你的实际表名 WHERE EXISTS (SELECT 1 FROM YourTableName WHERE PriceCardId = pc.PriceCardId AND Days = 2) AND EXISTS (SELECT 1 FROM YourTableName WHERE PriceCardId = pc.PriceCardId AND Days = 4) AND EXISTS (SELECT 1 FROM YourTableName WHERE PriceCardId = pc.PriceCardId AND Days = 5) AND EXISTS (SELECT 1 FROM YourTableName WHERE PriceCardId = pc.PriceCardId AND Days = 6)
逻辑说明:
对于每个PriceCardId,我们逐个检查目标列表中的每个Days值是否都存在于该ID的记录中,只有所有条件都满足的ID才会被选中。
注意事项:
- 记得把代码中的
YourTableName替换成你的实际数据表名称 - 如果目标列表可能包含重复值,需要根据业务逻辑调整统计方式(但示例中的列表是唯一整数,所以
COUNT(DISTINCT)是合适的) - 为了提升查询效率,建议在
PriceCardId和Days字段上创建联合索引
内容的提问来源于stack exchange,提问作者tungck
相关产品推荐
相关产品推荐

