Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Requête UPDATE sur deux tables liées

6 réponses
Avatar
Julien Pham
Bonjour,

Je cherche comment faire une requête update sur deux tables, selon le schéma
suivant :

Table 1, pour simplifier, deux champs, T1C1 et T1C2
Table 2, pour simplifier, deux champs, T2C1 et T2C2

En fait je veux faire un update où T1C2 prend la valeur de la somme de T2C2
par un group by de T2C1, sachant que le lien entre les deux tables c'est
T1C1=T2C1.

Exemple :
Table 1, T1C1 et T1C2 séparés par un /
1 / 0
2 / 0
3 / 0
4 / 0

Table 2, T2C1 et T2C2 séparés par un /
1 / 50
1 / 10
2 / 28
3 / 52
3 / 5
3 / 5
4 / 8

Et je veux obtenir pour la table 1 :
1 / 60
2 / 28
3 / 62
4 / 8

Une idée de comment je pourrais faire ma requête SQL ?

Merci

6 réponses

Avatar
Jerome BERTHAUD
Bonjour,

il vous faut dans un premier temps agréger le contenu de T2 pour obtenir le
résultat souhaité.
Ensuite une table temporaire peut permettre de stocker le résultat si le
calcul est complexe.
Dans l'exemple ci-dessous, lutilisation d'une sous requête permet d'arriver
plus directement au résultat.

USE tempdb

CREATE TABLE T1 (
C1 int ,
C2 int
)

INSERT INTO T1 (C1 ,C2) VALUES (1 ,0)
INSERT INTO T1 (C1 ,C2) VALUES (2 ,0)
INSERT INTO T1 (C1 ,C2) VALUES (3 ,0)
INSERT INTO T1 (C1 ,C2) VALUES (4 ,0)

CREATE TABLE T2 (
C1 int ,
C2 int
)

INSERT INTO T2 (C1 ,C2) VALUES (1 ,50)
INSERT INTO T2 (C1 ,C2) VALUES (1 ,10)
INSERT INTO T2 (C1 ,C2) VALUES (2 ,28)
INSERT INTO T2 (C1 ,C2) VALUES (3 ,52)
INSERT INTO T2 (C1 ,C2) VALUES (3 ,5)
INSERT INTO T2 (C1 ,C2) VALUES (3 ,5)
INSERT INTO T2 (C1 ,C2) VALUES (4 ,8)

UPDATE
T1
SET
C2 = ST2C2
FROM
T1
INNER JOIN (
/* Utilisation d'une sous requête pour agréger le résultat */
SELECT
C1 AS ST2C1 ,
SUM (C2) AS ST2C2
FROM
T2
GROUP BY
C1
) ST2
/* Créer une jointure sur le champ C1 pour rapprocher les 2 ensembles */
ON T1.C1 = ST2.ST2C1

SELECT * FROM T1

J. Berthaud
Winsight

"Julien Pham" wrote in message
news:
Bonjour,

Je cherche comment faire une requête update sur deux tables, selon le
schéma suivant :

Table 1, pour simplifier, deux champs, T1C1 et T1C2
Table 2, pour simplifier, deux champs, T2C1 et T2C2

En fait je veux faire un update où T1C2 prend la valeur de la somme de
T2C2 par un group by de T2C1, sachant que le lien entre les deux tables
c'est T1C1=T2C1.

Exemple :
Table 1, T1C1 et T1C2 séparés par un /
1 / 0
2 / 0
3 / 0
4 / 0

Table 2, T2C1 et T2C2 séparés par un /
1 / 50
1 / 10
2 / 28
3 / 52
3 / 5
3 / 5
4 / 8

Et je veux obtenir pour la table 1 :
1 / 60
2 / 28
3 / 62
4 / 8

Une idée de comment je pourrais faire ma requête SQL ?

Merci



Avatar
Julien Pham
"Jerome BERTHAUD" a écrit dans le message de
news: eUI$
Dans l'exemple ci-dessous, lutilisation d'une sous requête permet
d'arriver plus directement au résultat.


Merci beaucoup, je vais tester ça...
Avatar
Julien Pham
"Jerome BERTHAUD" a écrit dans le message de
news: eUI$
Dans l'exemple ci-dessous, lutilisation d'une sous requête permet
d'arriver plus directement au résultat.



Merci ça a marché, bien sûr j'ai adapté en fonction de mon utilisation
pratique, mais ça a fonctionné parfaitement...
Avatar
SQLpro [MVP]
Beaucoup plus simple :

UPDATE T1
SET C2 = (SELECT SUM (T2.C2)
FROM T2
WHERE T1.C1 = T2.C1
GROUP BY T1.C1, T2.C1)

A +


Julien Pham a écrit :
Bonjour,

Je cherche comment faire une requête update sur deux tables, selon le schéma
suivant :

Table 1, pour simplifier, deux champs, T1C1 et T1C2
Table 2, pour simplifier, deux champs, T2C1 et T2C2

En fait je veux faire un update où T1C2 prend la valeur de la somme de T2C2
par un group by de T2C1, sachant que le lien entre les deux tables c'est
T1C1=T2C1.

Exemple :
Table 1, T1C1 et T1C2 séparés par un /
1 / 0
2 / 0
3 / 0
4 / 0

Table 2, T2C1 et T2C2 séparés par un /
1 / 50
1 / 10
2 / 28
3 / 52
3 / 5
3 / 5
4 / 8

Et je veux obtenir pour la table 1 :
1 / 60
2 / 28
3 / 62
4 / 8

Une idée de comment je pourrais faire ma requête SQL ?

Merci






--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************
Avatar
Med Bouchenafa
A tester quelque chose du genre

UPDATE Table1
SET T1C2 = SELECT SUM(T2.T2C2) FROM Table2 T2 WHERE T2.T2C1 = T1.T1C1
FROM Table1 T1
--
Bien Cordialement
Med Bouchenafa


"Julien Pham" wrote:

Bonjour,

Je cherche comment faire une requête update sur deux tables, selon le schéma
suivant :

Table 1, pour simplifier, deux champs, T1C1 et T1C2
Table 2, pour simplifier, deux champs, T2C1 et T2C2

En fait je veux faire un update où T1C2 prend la valeur de la somme de T2C2
par un group by de T2C1, sachant que le lien entre les deux tables c'est
T1C1=T2C1.

Exemple :
Table 1, T1C1 et T1C2 séparés par un /
1 / 0
2 / 0
3 / 0
4 / 0

Table 2, T2C1 et T2C2 séparés par un /
1 / 50
1 / 10
2 / 28
3 / 52
3 / 5
3 / 5
4 / 8

Et je veux obtenir pour la table 1 :
1 / 60
2 / 28
3 / 62
4 / 8

Une idée de comment je pourrais faire ma requête SQL ?

Merci





Avatar
Jerome BERTHAUD
C'est effectivement plus concis et plus lisible mais cette syntaxe a un
inconvénient : elle génère un nombre d'exécution de la sous requête égal au
nb de ligne de T1 la sous requête faisant appel à la requête principale.
Sur des tables importantes, ca peut devenir problématique.
Le plan d'exécution permet de vérifier le nb d'exécutions de la sous
requête.

J. Berthaud
Winsight

"SQLpro [MVP]" wrote in message
news:egg$
Beaucoup plus simple :

UPDATE T1
SET C2 = (SELECT SUM (T2.C2)
FROM T2
WHERE T1.C1 = T2.C1
GROUP BY T1.C1, T2.C1)

A +


Julien Pham a écrit :
Bonjour,

Je cherche comment faire une requête update sur deux tables, selon le
schéma suivant :

Table 1, pour simplifier, deux champs, T1C1 et T1C2
Table 2, pour simplifier, deux champs, T2C1 et T2C2

En fait je veux faire un update où T1C2 prend la valeur de la somme de
T2C2 par un group by de T2C1, sachant que le lien entre les deux tables
c'est T1C1=T2C1.

Exemple :
Table 1, T1C1 et T1C2 séparés par un /
1 / 0
2 / 0
3 / 0
4 / 0

Table 2, T2C1 et T2C2 séparés par un /
1 / 50
1 / 10
2 / 28
3 / 52
3 / 5
3 / 5
4 / 8

Et je veux obtenir pour la table 1 :
1 / 60
2 / 28
3 / 62
4 / 8

Une idée de comment je pourrais faire ma requête SQL ?

Merci




--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************