web-dev-qa-db-fra.com

Comment mettre à jour plusieurs colonnes de plusieurs lignes dans une seule instruction SQL

Dans ma base de données SQL Server, je souhaite mettre à jour les colonnes de plusieurs lignes. Je peux le faire pour une seule ligne:

UPDATE theTable
SET theColumn = case
WHEN id = 1 then 'a' 
WHEN id = 2 then 'b'
WHEN id = 3 then 'c'
WHERE id in (1, 2, 3)

Comment puis-je mettre à jour plusieurs colonnes (theColumn2, theColumn3 ...) dans la même requête?

3
mohamed

Un exemple de la façon dont cela peut être fait (voir SQLFiddle ici ):

(ps j'ai utilisé un CTE (alias la clause WITH) et PostgreSQL (je n'utilise pas MS SQL Server ) mais les principes sont très similaires - à l'exception du type de données SERIAL - utilisez le type d'auto-incrémentation de MS!).

Créez et remplissez une table source (nommée une):

CREATE TABLE one
(
  record_id SERIAL,
  one_first_var INTEGER,
  one_second_var INTEGER,
  one_third_var INTEGER
);

INSERT INTO one (one_first_var, one_second_var, one_third_var) VALUES (1, 1, 1);
INSERT INTO one (one_first_var, one_second_var, one_third_var) VALUES (2, 2, 2);
INSERT INTO one (one_first_var, one_second_var, one_third_var) VALUES (3, 3, 3);

Et aussi une table cible (deux):

CREATE TABLE two
(
  record_id SERIAL,
  two_first_var INTEGER,
  two_second_var INTEGER,
  two_third_var INTEGER
);

INSERT INTO two (two_first_var, two_second_var, two_third_var) VALUES (21, 21, 21);
INSERT INTO two (two_first_var, two_second_var, two_third_var) VALUES (22, 22, 22);
INSERT INTO two (two_first_var, two_second_var, two_third_var) VALUES (23, 23, 23);

(revérifiez vos valeurs dans le tableau deux):

SELECT * FROM two;

Et puis exécutez votre mise à jour (plusieurs colonnes à la fois):

WITH my_values AS
(
  SELECT 
         one_first_var, 
         one_second_var, 
         one_third_var
  FROM one
  WHERE one_first_var = 2
)
UPDATE two 
SET 
  two_first_var = my_values.one_first_var,
  two_second_var = my_values.one_second_var,
  two_third_var = my_values.one_third_var
FROM
  my_values
WHERE
  two_second_var = 22;

Et puis réexécutez votre

SELECT * FROM two;

Encore une fois, voir le SQLFiddle !

Vous pouvez également utiliser un JOIN pour mettre à jour les enregistrements cibles. Je vous encourage à expérimenter ces techniques - très utiles!

Votre premier résultat pour deux (c'est-à-dire les valeurs insérées) ressemblera à ceci:

record_id   two_first_var   two_second_var  two_third_var
        1              21               21             21
        2              22               22             22
        3              23               23             23

et votre deuxième résultat (mis à jour) sera:

record_id   two_first_var   two_second_var  two_third_var
        2               2                2              2
        1              21               21             21
        3              23               23             23
5
Vérace

Vous pouvez fournir les nouvelles valeurs sous forme de table (à l'aide du constructeur de lignes ), afin de pouvoir la joindre à la table cible et utiliser le rejoignez l'instruction UPDATE, comme ceci:

UPDATE
  tgt
SET
  Column1 = src.Column1,
  Column2 = src.Column2,
  Column3 = src.Column3,
  ...
FROM
  dbo.TargetTable AS tgt
  INNER JOIN
  (
    VALUES
    (1, 'a', 'k', 'x', ...),
    (2, 'b', 'l', 'y', ...),
    (3, 'c', 'm', 'z', ...)
  ) AS src (ID, Column1, Column2, Column3, ...)
    ON tgt.ID = src.ID
;
4
Andriy M