在SQL Server 2008中,我想用另一行的数据更新一些行。例如,给出以下示例数据:
ID | NAME | PRICE
---------------------------------------
1 | Yellow Widget | 2.99
2 | Red Widget | 4.99
3 | Green Widget | 4.99
4 | Blue Widget | 6.99
5 | Purple Widget | 1.99
6 | Orange Widget | 5.99
我想更新ID为2,3和5的行,以获得第4行的价格。
我找到了一个很好的解决方案来更新Update the same table in SQL Server的单行,基本上看起来像:
DECLARE @src int = 4
,@dst int = 2 -- but what about 3 and 5 ?
UPDATE DST
SET DST.price = SRC.price
FROM widgets DST
JOIN widgets SRC ON SRC.ID = @src AND DST.ID = @dst;
但是因为我需要更新多行,所以我不确定JOIN
应该是什么样子。 SRC.ID = @src AND DST.ID IN (2, 3, 5)
? (不确定这是否是有效的SQL?)
另外,如果有人可以解释上面的解决方案如何不更新表中的所有行,因为没有WHERE
子句,那就太棒了!
有什么想法? TIA!
答案 0 :(得分:1)
您可以使用表变量来存储要更新的ID
:
DECLARE @tbl TABLE(ID INT PRIMARY KEY);
INSERT INTO @tbl VALUES (2), (3), (5);
DECLARE @destID INT = 4
UPDATE widgets
SET price = (SELECT price FROM widgets WHERE ID = @destID)
WHERE
ID IN(SELECT ID FROM @tbl)
或者,您可以将源ID和目标ID存储在单个表变量中。在这种情况下,您需要存储(2, 4)
,(3, 4)
和(5, 4)
。
DECLARE @tbl TABLE(srcID INT, destID INT, PRIMARY KEY(srcID, destID));
INSERT INTO @tbl VALUES (2, 4), (3, 4), (5, 4);
UPDATE s
SET s.Price = d.Price
FROM widgets s
INNER JOIN @tbl t ON t.srcID = s.ID
INNER JOIN widgets d
ON d.ID = t.destID