在我的 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...)?
您可以将新值作为表提供(在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)
如何做到这一点的示例(请参阅此处的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)