基于Id分组实现LineGroupBy值的动态SQL交集查询
动态实现多Id分组的LineGroupBy交集查询
需求说明
基于Id列分组,对LineGroupBy的值做所有组的交集运算,无需硬编码指定具体Id值。示例数据中,Id=1、5、8对应的LineGroupBy集合无共同元素,最终结果应为空集。
方法一:纯SQL统计法(推荐)
通过统计每个LineGroupBy在不同Id分组中的出现次数,筛选出在所有分组中都存在的LineGroupBy:
SELECT LineGroupBy FROM ( -- 先去重,确保同一个Id下的LineGroupBy只算一次 SELECT DISTINCT LineGroupBy, Id FROM #temp ) t GROUP BY LineGroupBy -- 出现次数等于总分组数(即不同Id的数量),说明该值在所有组中都存在 HAVING COUNT(*) = (SELECT COUNT(DISTINCT Id) FROM #temp)
如果没有交集,此查询返回空结果,符合预期。
方法二:动态SQL拼接INTERSECT语句
自动生成与静态查询逻辑一致的SQL语句,无需手动指定Id:
DECLARE @sql NVARCHAR(MAX) -- 拼接所有Id对应的查询语句,用INTERSECT连接 SELECT @sql = STRING_AGG( CONCAT('SELECT LineGroupBy FROM #temp WHERE Id = ', Id), ' INTERSECT ' ) FROM (SELECT DISTINCT Id FROM #temp) t -- 执行动态生成的SQL EXEC sp_executesql @sql
此方法完全复刻静态查询的INTERSECT逻辑,适合需要严格匹配原查询行为的场景。
示例验证
用提供的测试数据执行上述任一方法,都会返回空结果,符合预期。
内容的提问来源于stack exchange,提问作者Vajihe Jami
相关产品推荐
相关产品推荐

