SQL Server中如何优化多CODIGO同FECHA的查询语句?
优化SQL查询方案:获取指定CODIGO且FECHA跨多CODIGO存在的记录
针对你的需求——筛选CODIGO = 'AAA'且对应FECHA同时存在于CODIGO = 'BBB'和CODIGO = 'CCC'的记录,结合表主键(CODIGO + FECHA)的索引优势,提供以下几种高效优化方案:
方案一:分组统计+HAVING关联(推荐大表场景)
利用主键索引快速过滤目标CODIGO的记录,通过分组统计找出在三个CODIGO中都存在的FECHA,再关联回原表获取AAA的记录:
SELECT h.* FROM HISTORICO h INNER JOIN ( -- 筛选出在AAA、BBB、CCC中都存在的FECHA SELECT FECHA FROM HISTORICO WHERE CODIGO IN ('AAA', 'BBB', 'CCC') GROUP BY FECHA HAVING COUNT(DISTINCT CODIGO) = 3 ) f ON h.FECHA = f.FECHA WHERE h.CODIGO = 'AAA';
优势:子查询仅处理目标CODIGO的数据集,分组统计基于索引列执行,整体IO开销低,适合数据量较大的场景。
方案二:双重EXISTS判断(逻辑直观)
直接对每条AAA的记录,检查BBB和CCC是否存在相同FECHA的记录,利用主键索引快速定位匹配项:
SELECT * FROM HISTORICO h WHERE h.CODIGO = 'AAA' -- 检查该FECHA是否存在于BBB中 AND EXISTS ( SELECT 1 FROM HISTORICO WHERE CODIGO = 'BBB' AND FECHA = h.FECHA ) -- 检查该FECHA是否存在于CCC中 AND EXISTS ( SELECT 1 FROM HISTORICO WHERE CODIGO = 'CCC' AND FECHA = h.FECHA );
优势:逻辑清晰易懂,每个EXISTS子查询都通过主键索引直接定位,无需额外分组或排序,小数据量下性能优异。
方案三:窗口函数统计(代码简洁)
适用于SQL Server 2017及以上版本,通过窗口函数直接计算每个FECHA对应的不同CODIGO数量,再筛选符合条件的记录:
SELECT CODIGO, FECHA, VALOR FROM ( SELECT *, -- 统计每个FECHA下包含的不同CODIGO数量 COUNT(DISTINCT CODIGO) OVER(PARTITION BY FECHA) AS CodigoCount FROM HISTORICO WHERE CODIGO IN ('AAA', 'BBB', 'CCC') ) t WHERE CodigoCount = 3 AND CODIGO = 'AAA';
优势:无需关联子查询,代码结构简洁,窗口函数的计算基于过滤后的数据集,性能表现稳定。
性能注意事项
由于表主键是CODIGO + FECHA,以上所有方案都会自动利用该索引进行快速过滤和匹配,避免全表扫描。实际使用中可根据数据量大小和SQL Server版本选择最适合的方案。
内容的提问来源于stack exchange,提问作者Tomas
相关产品推荐
相关产品推荐

