如何在SQL Server中进行批量更新

5

我有一张包含数据的表格。表格数据如下:

ID | Name | Age
----------------
1  |  A   | 24
2  |  B   | 25
3  |  C   | 30
4  |  D   | 46
5  |  E   | 35
6  |  F   | 26
7  |  G   | 30

现在,我想要更新某些ID的年龄列,以便最终结果如下。

ID | Name | Age
----------------
1  |  A   | 24
2  |  B   | 22
3  |  C   | 35
4  |  D   | 50
5  |  E   | 27
6  |  F   | 26
7  |  G   | 30 

我更新了ID为2、3、4、5的行。

如何通过单个T-SQL查询实现此结果?这只是一个示例表。在实际情况中,它是一张拥有超过1500数据的表,因此逐个更新行会消耗很多时间。


我找到了一个解决方案,但我无法将其添加为答案。所以我决定编辑自己的问题并放置答案。请参考以下网址获取更多信息:

www.stackoverflow.com/questions/16932526/…

           UPDATE e 
           SET age = t.age 
           FROM table e 
           JOIN ( VALUES 
           (1, 26), 
           (2, 30), 
           (3, 35) ) 
           t (id, age) ON t.id = e.id 

1
将新数据添加到“暂存”表中,然后使用单个UPDATE语句和JOIN,即可更新所有相关行。无需循环、光标或其他RBAR(逐行煎熬)处理! - marc_s
你所说的“某些”是什么意思?标准是什么? - dario
@ImranRizvi,你的方法会影响主键,因为它是自增值。无论如何,非常感谢你分享你的意见。 - Sahan De Silva
我知道,但对我来说并不重要。对你来说重要吗?你的主键有关联吗? - Imran Rizvi
@ImranRizvi 是的。这很重要,因为我有一个巨大的数据库要处理。而且这不是真正的表格。实际情况是有一个拥有20多列和2000多个数据的表格,并且还连接了几个其他表格。 - Sahan De Silva
显示剩余4条评论
4个回答

5
BEGIN TRAN
UPDATE mytable SET age=99 WHERE id=2
UPDATE mytable SET age=99 WHERE id=3
UPDATE mytable SET age=99 WHERE id=4
UPDATE mytable SET age=99 WHERE id=5
COMMIT TRAN

看起来很“愚蠢”,但这是单个查询。


1
这并不是看起来很愚蠢。虽然从这种方法进行需要时间,但它仍然提供了一个答案。非常感谢您分享这个想法。我一定会研究一下的。如果您有其他方法,请在这里也好心分享。再次感谢。 - Sahan De Silva

2
以下脚本应该能解决问题:
UPDATE TABLENAME
SET Age = CASE WHEN Age = 25 THEN 22
             WHEN Age = 30 THEN 35
             WHEN Age = 46 THEN 50
             WHEN Age = 35 THEN 27
             END
WHERE ID IN (2,3,4,5)

希望这有所帮助。

可以使用WHEN关键字,但是对于批量更新来说,它会消耗很多时间。无论如何,非常感谢您分享您的意见。我一定会研究这种方法。 - Sahan De Silva

2

在这种情况下,我会选择使用join进行更新:

UPDATE T1
SET T1.AGE = T2.AGE
FROM T1
INNER JOIN (SELECT 2 AS ID, 22 AS AGE UNION
            SELECT 3, 35 UNION
            SELECT 4, 50 UNION
            SELECT 5, 27) AS T2
   ON T1.ID = T2.ID

如果他们给了你需要更新的ID列表和年龄,你可以在Excel中使用公式轻松生成内部选择联合,并将其放置在那里。
希望这能帮到你。

非常感谢您分享您的意见。我一定会研究这种方法。 - Sahan De Silva

1

你应该参考更新语句。现在有很多方法可以实现你想要的,例如,你可以看这里here。一个简单的例子如下:

UPDATE mytable SET
    Age= CASE WHEN id=2 THEN 22 WHEN id=3 THEN 35  WHEN id=4 THEN 50 WHEN id=5 THEN 27 END
WHERE id IN (2, 3, 4, 5);

想要了解更多关于案例的内容,请点击这里


1
它可以工作,但远离优秀解决方案。 - i486
真的。这个可行。但问题在于当您需要进行批量更新时(例如:对于超过1500个数据),会出现问题。无论如何,非常感谢。我会参考您分享的链接。 - Sahan De Silva
@i486 同意,不过话说回来,这个问题远非常规做法。 - No Idea For Name
虽然使用正则表达式可以轻松实现,但这并不是最好的方法。 - mxix
通常当您有批量更新时,您会有一个逻辑来解释更改的含义(例如将年龄增加1),然后您就不需要像这里一样使用特定的情况。 - No Idea For Name

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接