web-dev-qa-db-fra.com

Mise à jour ... Syntaxe pour iSeries pour un développeur de serveur MS SQL

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?

3
ajeh

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.

10
ypercubeᵀᴹ

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 )

7
Fabricio Araujo

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
    )
0
WarrenT