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.
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
.
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;
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
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
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));