web-dev-qa-db-fra.com

db2: met à jour plusieurs lignes et champs avec une sélection sur une autre table

est-il possible d'incrémenter les champs a et b d'une table (A.a et A.b) en utilisant les valeurs c et d d'une autre table (B.c B.d) pour toute la ligne de A où A.x == B.z?

Je deviens fou avec cette requête

7
Luka

DB2 et le standard SQL n’ont pas de clause FROM dans une instruction UPDATE. Vous devez donc séparer clairement les étapes suivantes: 

  1. identifier les lignes à modifier et à
  2. calcule la nouvelle valeur.

.

Voici un exemple:

UPDATE TABLE A
SET A.FLD_SUPV = ( SELECT B.FLD_SUPV
FROM TABLEA A, TABLEB B, TABLEC C,TABLED D
WHERE A.FLD1= B.FLD1
AND A.FLD_DT >= B.FLD_FM_DT
AND A.FLD_DT <= B.FLD_THRU_DT
AND A.FLD_DT > D.FLD_THRU_DT
AND A.FLD_DT < C.FLD_EFF_DT )
WHERE EXISTS ( SELECT B.FLD_SUPV
FROM TABLEA A, TABLEB B, TABLEC C,TABLED D
WHERE A.FLD1= B.FLD1
AND A.FLD_DT >= B.FLD_FM_DT
AND A.FLD_DT <= B.FLD_THRU_DT
AND A.FLD_DT > D.FLD_THRU_DT
AND A.FLD_DT < C.FLD_EFF_DT )

Pour mettre à jour deux champs, vous pouvez utiliser un exemple comme celui-ci:

UPDATE table1 t1 
 SET (col1, col2) = (
  SELECT col3, col4 
  FROM  table2 t2 
  WHERE t1.col8=t2.col9
 )

L'optimiseur verra que les sous-requêtes de la clause SET et de la clause FROM Sont identiques et il devrait les fusionner dans le plan d'exécution interne.

8
aF.

Oui c'est possible. Vous pouvez essayer quelque chose comme ça:

MERGE INTO A
USING (SELECT c, d, z from B) B
ON (A.x = B.z)
WHEN MATCHED THEN
UPDATE SET A.a = A.a + B.c, A.b = A.b + B.d;

Vous pouvez en savoir plus sur MERGE ici .

5
jhnwsk

Testé sous DB2 10.6

Pratiquement la même chose que @jhnwsk, mais avec des raccourcis dans les tableaux. 

Merge into "PRODUCTION"."COUNTRY" as N
      using (SELECT OD.NAME,OD.KEY from "DEVELOPMENT"."COUNTRY" as OD) as O
      on (O.KEY = N.KEY)
      WHEN MATCHED THEN
           UPDATE SET N.NAME=O.NAME;
0
Tim Seed