OVH Cloud OVH Cloud

UPDATE avec un regroupement

3 réponses
Avatar
Yanos El Guerilleros
Salut,

Voila j'ais besoin de mettre à jour plusieurs champs d'une table a
partir d'un regroupement d'une autre table. Actuellement je fais une
instruction dans le genre suivant :

UDPATE T1 SET
T1_MIN = (SELECT MIN(T2_VAL) FROM T2 WHERE T1_T2_ID = T2_ID),
T1_MAX = (SELECT MAX(T2_VAL) FROM T2 WHERE T1_T2_ID = T2_ID),
T1_AVG = (SELECT AVG(T2_VAL) FROM T2 WHERE T1_T2_ID = T2_ID)

Je trouve ca un peu lourd et je me demandais si il était possible de
faire quelque chose d'identique avec la clause FROM dans le genre :

UPDATE T1 SET
T1_MIN = MIN(T2_VAL),
T1_MAX = MAX(T2_VAL),
T1_AVG = AVG(T2_VAL)
FROM
T1
LEFT JOIN T2 ON T1_T2_ID = T2_ID

Mais ca ne fonctionne pas j'ai toujours l'erreur :
'Il manque un agrégat dans la liste de définition d'une instruction UPDATE.'

même si je lui met un GROUP BY.

Alors est-ce tout simplement possible ?

Merci

A++

Yanos

3 réponses

Avatar
Patrice
Même message qu'avec le group by ?

--

"Yanos El Guerilleros" a écrit dans le message
de news:ukQb0%
Salut,

Voila j'ais besoin de mettre à jour plusieurs champs d'une table a
partir d'un regroupement d'une autre table. Actuellement je fais une
instruction dans le genre suivant :

UDPATE T1 SET
T1_MIN = (SELECT MIN(T2_VAL) FROM T2 WHERE T1_T2_ID = T2_ID),
T1_MAX = (SELECT MAX(T2_VAL) FROM T2 WHERE T1_T2_ID = T2_ID),
T1_AVG = (SELECT AVG(T2_VAL) FROM T2 WHERE T1_T2_ID = T2_ID)

Je trouve ca un peu lourd et je me demandais si il était possible de
faire quelque chose d'identique avec la clause FROM dans le genre :

UPDATE T1 SET
T1_MIN = MIN(T2_VAL),
T1_MAX = MAX(T2_VAL),
T1_AVG = AVG(T2_VAL)
FROM
T1
LEFT JOIN T2 ON T1_T2_ID = T2_ID

Mais ca ne fonctionne pas j'ai toujours l'erreur :
'Il manque un agrégat dans la liste de définition d'une instruction


UPDATE.'

même si je lui met un GROUP BY.

Alors est-ce tout simplement possible ?

Merci

A++

Yanos


Avatar
Patrice
Je pense que le problème est que le group by ne peut pas s'appliquer sur la
jointure. Je pense plutôt à quelque chose comme :

UPDATE a SET Total=b.Total
FROM a
JOIN (SELECT Data,SUM(Valeur) AS Total FROM B GROUP BY Data) AS b
ON a.Data=B.Data

--
Patrice

"Yanos El Guerilleros" a écrit dans le message
de news:ukQb0%
Salut,

Voila j'ais besoin de mettre à jour plusieurs champs d'une table a
partir d'un regroupement d'une autre table. Actuellement je fais une
instruction dans le genre suivant :

UDPATE T1 SET
T1_MIN = (SELECT MIN(T2_VAL) FROM T2 WHERE T1_T2_ID = T2_ID),
T1_MAX = (SELECT MAX(T2_VAL) FROM T2 WHERE T1_T2_ID = T2_ID),
T1_AVG = (SELECT AVG(T2_VAL) FROM T2 WHERE T1_T2_ID = T2_ID)

Je trouve ca un peu lourd et je me demandais si il était possible de
faire quelque chose d'identique avec la clause FROM dans le genre :

UPDATE T1 SET
T1_MIN = MIN(T2_VAL),
T1_MAX = MAX(T2_VAL),
T1_AVG = AVG(T2_VAL)
FROM
T1
LEFT JOIN T2 ON T1_T2_ID = T2_ID

Mais ca ne fonctionne pas j'ai toujours l'erreur :
'Il manque un agrégat dans la liste de définition d'une instruction


UPDATE.'

même si je lui met un GROUP BY.

Alors est-ce tout simplement possible ?

Merci

A++

Yanos


Avatar
Yanos El Guerilleros
Patrice a écrit :
Je pense que le problème est que le group by ne peut pas s'appliquer sur la
jointure. Je pense plutôt à quelque chose comme :

UPDATE a SET Total=b.Total
FROM a
JOIN (SELECT Data,SUM(Valeur) AS Total FROM B GROUP BY Data) AS b
ON a.Data=B.Data




Exact, j'étais trop fatigué hier soir, ce matin en me levant j'ai eu la
même idée :)

Merci,

A++

Yanos