SQL Server Update Group по - PullRequest
       19

SQL Server Update Group по

37 голосов
/ 18 мая 2010

Я пытаюсь выполнить это на 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

Кто-нибудь знает, как можно решить эту проблему, имея хорошую производительность.

Ответы [ 3 ]

59 голосов
/ 08 августа 2011

Попробуйте

;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 
18 голосов
/ 03 октября 2013

В 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 

является избыточным.

Объединение решает требование "всего в (...)". Сгруппируйте по ключу, а затем присоединитесь.

12 голосов
/ 18 мая 2010

Вы не можете использовать агрегат в запросе ОБНОВЛЕНИЯ для начала - хотя вы не включили сообщение об ошибке в исходный вопрос, я подозреваю, что это то, что он говорит вам.

Вам нужно будет рассчитать агрегат перед обновлением и сохранить результаты во временной таблице, а затем присоединиться к этой таблице, чтобы выполнить обновление.

...