web-dev-qa-db-fra.com

Mise à jour de plusieurs colonnes dans une seule instruction de mise à jour dans DB2

Je souhaite mettre à jour plusieurs colonnes d'une table dans DB2 avec une seule instruction Update. 

Toute allusion ou idée sera appréciable. Merci.

15
Superman

L'instruction de mise à jour dans toutes les versions de SQL ressemble à ceci:

update table
    set col1 = expr1,
        col2 = expr2,
        . . .
        coln = exprn
    where some condition

La réponse est donc que vous séparez les affectations en utilisant des virgules et ne répétez pas l'instruction set.

33
Gordon Linoff

Si les valeurs proviennent d'une autre table, vous pouvez utiliser

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

Exemple:

UPDATE table1
SET (col1, col2, col3) =(
   (SELECT MIN (ship_charge), MAX (ship_charge) FROM orders), 
   '07/01/2007'
)
WHERE col4 = 1001;
5
betrice mpalanzi
update table_name set (col1,col2,col3) values(col1,col2,col);

N'est pas le SQL standard et ne fonctionne pas. Vous devez utiliser ceci comme Gordon Linoff dit:

update table
    set col1 = expr1,
        col2 = expr2,
        . . .
        coln = exprn
    where some condition
0
Dan

Je sais que c'est une vieille question, mais je devais trouver une solution pour la mise à jour de plusieurs lignes où plusieurs enregistrements devaient être mis à jour avec des valeurs différentes en fonction de leurs ID et j'ai découvert que je pouvais utiliser un sous-sélecteur scalaire

UPDATE PROJECT
  SET DEPTNO =
        (SELECT WORKDEPT FROM EMPLOYEE
           WHERE PROJECT.RESPEMP = EMPLOYEE.EMPNO)
  WHERE RESPEMP='000030'

(avec WHERE facultatif, bien sûr)

De plus, j'ai constaté qu'il était essentiel de spécifier qu'aucune valeur NULL ne serait utilisée dans cette mise à jour (au cas où tous les enregistrements de la première table n'auraient pas l'enregistrement correspondant dans la seconde), de cette manière:

UPDATE PROJECT
  SET DEPTNO =
        (SELECT WORKDEPT FROM EMPLOYEE
           WHERE PROJECT.RESPEMP = EMPLOYEE.EMPNO)
  WHERE RESPEMP IN (SELECT EMPNO FROM EMPLOYEE)

Source: https://www.ibm.com/support/knowledgecenter/ssw_i5_54/sqlp/rbafyupdatesub.htm

0
InitK

C'est une "solution old school", quand la commande MERGE ne fonctionne pas (je pense avant la version 10). 

UPDATE TARGET_TABLE T 
SET (T.VAL1, T.VAL2 ) =  
(SELECT S.VAL1, S.VAL2
 FROM SOURCE_TABLE S 
 WHERE T.KEY1 = S.KEY1 AND T.KEY2 = S.KEY2)
WHERE EXISTS 
(SELECT 1  
 FROM SOURCE_TABLE S 
 WHERE T.KEY1 = S.KEY1 AND T.KEY2 = S.KEY2 
   AND (T.VAL1 <> S.VAL1 OR T.VAL2 <> S.VAL2));
0
Hennie van Dyk