web-dev-qa-db-fra.com

Groupe de mise à jour SQL Server par

J'essaie d'exécuter cela sur MS-SQL mais me renvoie une erreur juste au niveau du groupe par ligne

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

Quelqu'un sait-il comment résoudre ce problème avec de bonnes performances?.

40
Gerardo Abdo

Essayer

;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 
60
Code Magician

Dans SQL Server, vous pouvez effectuer une agrégation dans une requête de mise à jour, il vous suffit de le faire dans une sous-requête, puis de la joindre sur la table que vous souhaitez mettre à jour.

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 

Ce faisant:

WHERE total in (select id from #temp)

Puis:

 INNER JOIN counts 
    ON t.id = counts.total 

Est redondant.

La jointure résout l'exigence "total en (...)". Regroupez la clé, puis rejoignez-la.

21
MattInNY

Vous ne pouvez pas utiliser un agrégat dans une requête UPDATE, pour commencer - bien que vous n'ayez pas inclus le message d'erreur dans votre question d'origine, je suppose que c'est ce que cela vous dit.

Vous devrez calculer l'agrégat avant votre mise à jour et stocker les résultats dans une table temporaire, puis vous joindre à cette table pour effectuer votre mise à jour.

12
SqlRyan