我想使用更新查询更新多行。有一个主键。我不想更新主键。假设
id name address age
1 as re3 20
2 dg ht5 21
3 hf ujy6 23
4 ku tr5 25
是表格。 我想依次更新姓名、地址和年龄。 我有一组新值作为输入。喜欢
("yJ","ht43",34)
("rt","fd43",36)
("hg","hgd4",40)
("ui","udg6",28)
如何通过更新查询使用这些值顺序更新行?
最佳答案
您可以通过为现有值和新值分配行号来完成此操作。然后在该行号上连接两个数据集,并进行相应更新:
WITH YourTableRanked AS
( SELECT t.*,
RowNum = ROW_NUMBER() OVER(ORDER BY ID)
FROM YourTable AS t
), NewValues AS
( SELECT t.*,
RowNum = ROW_NUMBER() OVER(ORDER BY Name)
FROM (VALUES
('yJ','ht43',34),
('rt','fd43',36),
('hg','hgd4',40),
('ui','udg6',28)
) AS t (Name, Address, Age)
)
UPDATE T
SET Name = v.Name,
Address = v.Address,
Age = v.Age
FROM YourTableRanked AS t
INNER JOIN NewValues AS v
ON v.RowNum = t.RowNum;
值得注意的是,任何类型的 TOP
或排名操作要么不是有效的语法,要么在缺少 ORDER BY
子句的情况下不是特别有用。因此,当您提到“顺序”更新行时,为了使顺序具有任何含义,您需要定义此序列的顺序。在我发布的查询中,我已按新值中的 Name
进行排序,并按现有数据中的 ID
进行排序,但您可能希望更改此设置以满足您的需求。
完整示例:
CREATE TABLE #T (ID INT, Name VARCHAR(2), Address VARCHAR(5), Age INT);
INSERT #T (id, name, address, age)
VALUES
(1, 'as', 're3', 20),
(2, 'dg', 'ht5', 21),
(3, 'hf', 'ujy6', 23),
(4, 'ku', 'tr5', 25);
WITH YourTableRanked AS
( SELECT t.*,
RowNum = ROW_NUMBER() OVER(ORDER BY ID)
FROM #t AS t
), NewValues AS
( SELECT t.*,
RowNum = ROW_NUMBER() OVER(ORDER BY Name)
FROM (VALUES
('yJ','ht43',34),
('rt','fd43',36),
('hg','hgd4',40),
('ui','udg6',28)
) AS t (Name, Address, Age)
)
UPDATE T
SET Name = v.Name,
Address = v.Address,
Age = v.Age
FROM YourTableRanked AS t
INNER JOIN NewValues AS v
ON v.RowNum = t.RowNum;
SELECT *
FROM #T;
DROP TABLE #T;
关于sql - 使用一组值 sql 更新多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26624874/