Ответ 1
Попробуйте
;with counts
AS
(
SELECT total, COUNT(*) as dos
FROM temp_table2010
WHERE total in (select id from #temp)
)
UPDATE T
SET dos=counts.dos
FROM #temp T
INNER JOIN counts
ON t.id = counts.total
Я пытаюсь выполнить это на MS-SQL, но возвращает мне ошибку только в группе по строке
update #temp
Set Dos=Count(1)
From Temp_Table2010 s
where Id=s.Total and s.total in (Select Id from #temp)
group by s.Total
Кто-нибудь знает, как я могу решить эту проблему с хорошей производительностью.
Попробуйте
;with counts
AS
(
SELECT total, COUNT(*) as dos
FROM temp_table2010
WHERE total in (select id from #temp)
)
UPDATE T
SET dos=counts.dos
FROM #temp T
INNER JOIN counts
ON t.id = counts.total
В SQL Server вы можете выполнить агрегацию в запросе обновления, который вам нужно сделать только в подзапросе, а затем присоединить его к таблице, которую вы хотите обновить.
UPDATE #temp
SET Dos = Cnt
FROM #temp
INNER JOIN (SELECT Total, COUNT(*) AS Cnt FROM Temp_Table2010 GROUP BY Total) AS s
ON Id = s.Total
Выполнение этого действия:
WHERE total in (select id from #temp)
И затем:
INNER JOIN counts
ON t.id = counts.total
Является избыточным.
Соединение решает требование "всего в (...)". Группируйте по ключу, а затем присоединитесь.
Вы не можете использовать агрегат в запросе UPDATE для стартеров - хотя в исходном вопросе вы не указали сообщение об ошибке, я подозреваю, что он вам говорит.
Вам нужно будет рассчитать агрегат перед обновлением и сохранить результаты в таблице temp, а затем присоединиться к этой таблице, чтобы выполнить обновление.