如何优化重复SQL代码?消除记录查询与求和的重复逻辑
精简重复查询的SQL方案
你可以通过合并查询逻辑,一次计算求和结果并完成存在性判断来消除重复代码,无需执行两次相同的JOIN和过滤操作。以下是两种可行方案:
方案一:直接计算总和并判断(最优,仅单次数据扫描)
直接先计算@sum,利用SUM()函数在无匹配行时返回NULL的特性,替代原有的EXISTS检查:
DECLARE @sum DECIMAL(10, 2); -- 仅执行一次查询,同时完成求和与筛选 SELECT @sum = SUM(m.[Amount]) FROM dbo.Ingredients i INNER JOIN dbo.Materials m ON i.Material = m.Id AND m.[Count] > (i.[Count] * @сount) WHERE i.Product = @product; -- 当@sum不为NULL时,说明存在符合条件的数据 IF @sum IS NOT NULL BEGIN -- 此处编写原BEGIN块内的业务逻辑 ... END
方案二:使用CTE复用查询逻辑(适合多次复用查询场景)
如果后续还有需要复用该筛选逻辑的场景,可以用公共表表达式(CTE)定义一次查询逻辑,再多次引用:
WITH QualifiedRecords AS ( SELECT m.[Amount] FROM dbo.Ingredients i INNER JOIN dbo.Materials m ON i.Material = m.Id AND m.[Count] > (i.[Count] * @сount) WHERE i.Product = @product ) BEGIN DECLARE @sum DECIMAL(10, 2); SELECT @sum = SUM([Amount]) FROM QualifiedRecords; IF EXISTS(SELECT 1 FROM QualifiedRecords) BEGIN -- 后续业务逻辑 ... END END
说明
原代码中EXISTS和求和查询的过滤条件完全一致,因此无需分开执行两次查询。方案一只需扫描一次数据,性能更优;方案二则更适合需要多次复用同一筛选逻辑的场景。
内容的提问来源于stack exchange,提问作者dmmhlchk
相关产品推荐
相关产品推荐

