2010-01-11 2 views
3

Comment mettre à jour une colonne d'une table à l'aide d'une fonction d'agrégation dans l'instruction sql update?mise à jour avec la valeur renvoyée par la fonction d'agrégat

+0

C'est trop vague, mais cela semble un peu suspect, dans un genre de dénormalisation. S'il vous plaît donnez quelques détails de ce que vous essayez de réaliser, afin que nous puissions mieux répondre à votre question. – APC

Répondre

5

La fonction Agréger agrège, par définition, un ou plusieurs enregistrements de l'entrée dans un seul enregistrement dans un jeu de résultats, de sorte qu'il n'est pas évident de savoir lequel vous voulez mettre à jour.

En général, vous pouvez utiliser des fonctions d'agrégation dans une sous-requête:

UPDATE mytable 
SET  mycol = 
     (
     SELECT SUM(othercol) 
     FROM othertable o 
     WHERE o.yetothercol = m.yetmycol 
     ) 

, dans un JOIN (œuvres en MySQL et SQL Server)

UPDATE mytable 
JOIN (
     SELECT yetothercol, SUM(othercol) AS psum 
     FROM othertable 
     GROUP BY 
       yetothercol 
     ) s 
ON  yetmycol = yetothercol 
SET  mycol = psum 

, ou dans une déclaration MERGE (œuvres Oracle et SQL Server 2008):

MERGE 
INTO mycol 
USING (
     SELECT yetothercol, SUM(othercol) AS psum 
     FROM othertable 
     GROUP BY 
       yetothercol 
     ) s 
ON  (yetmycol = yetothercol) 
WHEN MATCHED THEN 
UPDATE 
SET  mycol = psum 
+0

J'ai une question concernant la première suggestion. Comment être sûr que l'ordre de la sous-requête est correct pour asigner des valeurs à myco? Vous spécifiez m.yetmycol dans la clause where (je suppose que vous voulez dire mytable comme m). Comment savez-vous si cela va sortir dans l'ordre de o.yetothercol ou m.yetmycol? Est-ce prévisible? (Je pensais que ça ne devrait pas être une autre question, mais peut-être que ce serait plus facile à demander.) –

+0

@Etiennebr: qu'entendez-vous par "l'ordre de la sous-requête"? – Quassnoi

+0

Eh bien, je ne suis pas sûr de la terminologie ici, mais la requête contenant la jointure ressemble à une sous-requête (il y a une requête SELECT dans une requête UPDATE). Et je pense avoir répondu moi-même à ma question. La commande est garantie par o.yetothercol = m.yetmycol et le fait que m est en dehors de la première requête. –

Questions connexes