2010-05-17 7 views
29

Je suis en train d'exécuter ce sur MS-SQL, mais me renvoie une erreur juste au Groupe par ligneGroupe de mise à jour SQL Server par

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 

Ne quelqu'un sait comment puis-je résoudre ce problème d'avoir une bonne performance.

+0

Pouvez-vous décrire ce que vous essayez de faire ici? Je vais essayer de vous aider à réécrire la requête, mais je n'arrive pas à comprendre ce que vous essayez d'accomplir. Comme les noms des tables ne sont pas significatifs, vous pouvez peut-être au moins donner une liste de colonnes dans chacun et un échantillon des données que vous regardez. – SqlRyan

Répondre

11

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 initiale, je suppose que c'est ce qu'il vous dit.

Vous devez 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.

48

Essayez

;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 
+3

cela s'appelle l'utilisation d'une expression de table commune (ou CTE.) Certains documents - https://technet.microsoft.com/en-us/library/ms190766(v=sql.105).aspx et https: // msdn.microsoft.com/en-us/library/ms175972.aspx – mmcrae

+0

Qu'en est-il du point-virgule au début de '; with counts', cela sert-il à un but autre que la fermeture de l'instruction précédente? – Splatmistro

+0

"avec" signifie autre chose quand ce n'est pas le début d'une déclaration. Les points-virgules sont facultatifs dans T-sql, donc l'analyseur doit déduire où les points-virgules doivent aller. S'il y a une instruction select précédant immédiatement le CTE, il est ambigu à l'analyseur si avec fait partie de l'instruction précédente ou est propre. le point-virgule le rend explicite. Il a été adopté comme une convention pour éviter tout problème d'analyse. –

14

Dans SQL Server, vous pouvez faire l'agrégation dans une requête de mise à jour il vous suffit de le faire dans un sous-requête puis rejoindre 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 

Faire ceci:

WHERE total in (select id from #temp) 

Et puis:

INNER JOIN counts 
    ON t.id = counts.total 

est redondant.

La jointure résout l'exigence "total en (...)". Groupez sur la clé puis rejoignez.

Questions connexes