Lorsque je voulais mettre à jour une table sur les valeurs d'une autre table dans SQL Server, je utiliserais la syntaxe suivante:
UPDATE t1
SET t1.a = t2.a
FROM t1
INNER JOIN t2 ON t2.b = t1.b
Quelle serait la syntaxe d'Iseries 7?
Je ne sais pas sur Iseries7 mais certains SGBD (comme Oracle) permettent cela - tant que t2 (b)
est une clé unique ou primaire:
UPDATE
( SELECT t1.a AS t1a, t2.a AS t2a
FROM t1
INNER JOIN t2 ON t2.b = t1.b
) u
SET
t1a = t2a ;
Testé à (Oracle 11g) SQL-FIDDLE
Les autres SGBD permettent cette syntaxe (comme SQL-Server qui ne fait aucun problème sur l'unicité, bien que ce ne soit pas une bonne chose *):
WITH u AS
( SELECT t1.a AS t1a, t2.a AS t2a
FROM t1
INNER JOIN t2 ON t2.b = t1.b
)
UPDATE u
SET
t1a = t2a ;
Testé à (SQL-Server 2008) SQL-FIDDLE
*Voir l'article de Blog: Décape-t-on la mise à jour de! Où Hugo Kornelis mentionne):
[.____] ... SQL Server mettra heureux à la mise à jour de la même rangée si elle correspond à plus d'une ligne dans la table jointe, avec seulement le résultat du dernier de ces mises à jour colle. ...
Vous pouvez également vérifier cette syntaxe qui n'utilise pas de CTES ou de vues mises à jour - et fonctionnera donc dans presque tous les SGBD:
UPDATE t1
SET a =
( SELECT t2.a
FROM t2
WHERE t2.b = t1.b
)
WHERE EXISTS
( SELECT *
FROM t2
WHERE t2.b = t1.b
) ;
Selon le Manuel en ligne de DB2 I Série 7: Mise à jour - et si je le lisez correctement - seul le 3ème chemin est une option dans DB2 pour Iseries7. La 1ère méthode fonctionnera aussi si la table dérivée (u
) a été définie comme une vue.
Essayez d'utiliser le MERGE
instruction de SQL2003 Standard - qui correspond à l'équivalent de UPDATE..SET..FROM
Syntaxe.
Exemple:
MERGE INTO dbo.t1 AS Target
USING (SELECT a,b,c FROM dbo.t2) AS Source
ON (Target.b = Source.b)
WHEN MATCHED THEN
UPDATE SET Target.a = Source.a
Remarque: pour Iseries, MERGE
nécessite INTO
(crédit : Jeff Stevens )
Afin d'ajuster vos relevés de mise à jour, ils devraient ressembler à ceci.
UPDATE t1
SET a = (SELECT a
FROM t2
WHERE t2.b = t.b
)
WHERE b in (SELECT b
FROM t2
)
Et la déclaration de mise à jour de plusieurs colonnes pourrait ressembler à ceci:
UPDATE t1
SET ( x, y, z ) =
(SELECT
x, y, z
FROM t2
WHERE t2.b = t1.b
)
WHERE b in
(SELECT
b
FROM t2
)