如何在一条 SQL 语句中更新多行的多列

moh*_*med 4 sql-server update

在我的 SQL Server 数据库中,我想更新多行的列。我只能为一行做:

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)
Run Code Online (Sandbox Code Playgroud)

如何在同一查询中更新更多列(theColumn2、theColumn3...)?

And*_*y M 5

您可以将新值作为表提供(在VALUES行构造函数的帮助下),以便您可以将其与目标表连接并在 UPDATE 语句中使用连接,如下所示:

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
;
Run Code Online (Sandbox Code Playgroud)


Vér*_*ace 5

如何做到这一点的示例(请参阅此处的SQLFiddle ):(

ps 我使用了CTE(又名WITH子句)和 PostgreSQL(我不使用 MS SQL Server),但原理非常相似——除了SERIAL数据类型- 使用 MS 的自动递增类型!)。

创建并填充一个源表(命名为一个):

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);
Run Code Online (Sandbox Code Playgroud)

还有一个目标表(两个):

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);
Run Code Online (Sandbox Code Playgroud)

(仔细检查表二中的值):

SELECT * FROM two;
Run Code Online (Sandbox Code Playgroud)

然后运行您的更新(一次多列):

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;
Run Code Online (Sandbox Code Playgroud)

然后重新运行你的

SELECT * FROM two;
Run Code Online (Sandbox Code Playgroud)

再次,请参阅SQLFiddle

您还可以使用 aJOIN来更新目标记录。我鼓励你尝试这些技术——非常有用!

两个(即插入的值)的第一个结果将如下所示:

record_id   two_first_var   two_second_var  two_third_var
        1              21               21             21
        2              22               22             22
        3              23               23             23
Run Code Online (Sandbox Code Playgroud)

你的第二个(更新)结果将是:

record_id   two_first_var   two_second_var  two_third_var
        2               2                2              2
        1              21               21             21
        3              23               23             23
Run Code Online (Sandbox Code Playgroud)