Вы можете использовать EXCEPT
только для вставки записей, которые еще не существуют в вашей таблице. например:
INSERT #temp_costs_count (version_id, total_costs, cost_included)
SELECT version_id,
count(*),
sum(case when is_included = 1 then 1 else 0 end)
FROM #temp_costs
GROUP BY version_id
EXCEPT
SELECT version_id, total_costs, cost_included
FROM #temp_costs_count;
Или, если вы определяете дубликат по-другому (например, просто запись с этим конкретным version_id
), тогда вы можете использовать NOT EXISTS
например ::
INSERT #temp_costs_count (version_id, total_costs, cost_included)
SELECT version_id,
count(*),
sum(case when is_included = 1 then 1 else 0 end)
FROM #temp_costs AS tc
WHERE NOT EXISTS (SELECT 1 FROM temp_costs_count AS tcc WHERE tcc.version_id = tc.version_id)
GROUP BY version_id;
Кроме того, я, вероятно, могу, с одной стороны, посчитать, сколько раз у меня было , чтобы использовать цикл в SQL Server (и я тратил почти каждый рабочий день за последние 12 лет написание SQL). По моему опыту, примерно в 99,9% случаев, когда кто-то считает, что ему нужно использовать цикл, он этого не делает, и существует гораздо более эффективное решение на основе множеств.