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 ?
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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
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" <privacy@invalid.net> wrote in message
news:ej4pmTATGHA.4976@TK2MSFTNGP11.phx.gbl...
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 ?
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
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...
"Jerome BERTHAUD" <jerome.berthaud@winsight.fr> a écrit dans le message de
news: eUI$0EBTGHA.5656@TK2MSFTNGP11.phx.gbl...
Dans l'exemple ci-dessous, lutilisation d'une sous requête permet
d'arriver plus directement au résultat.
"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...
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 ***********************
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 ***********************
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 ***********************
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
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 ?
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
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 ***********************
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]" <brouardf@club-internet.fr> wrote in message
news:egg$bMCTGHA.5108@TK2MSFTNGP09.phx.gbl...
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 ***********************
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 ***********************