将数据复制到SQL Server中同一表中的现有行
在SQLServer2008中,我想用另一行的数据更新某些行。例如,给定以下示例数据:将数据复制到SQL Server中同一表中的现有行,sql,sql-server,sql-update,Sql,Sql Server,Sql Update,在SQLServer2008中,我想用另一行的数据更新某些行。例如,给定以下示例数据: ID | NAME | PRICE --------------------------------------- 1 | Yellow Widget | 2.99 2 | Red Widget | 4.99 3 | Green Widget | 4.99 4 | Blue Widget |
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行的价格
我找到了一个很好的解决方案来更新一行,基本上如下所示:
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;
但是由于我需要更新多行,我不确定连接应该是什么样子SRC.ID=@SRC和DST.ID在(2,3,5)中
?(不确定这是否是有效的SQL?)
另外,如果有人能解释上面的解决方案如何不更新表中的所有行,因为没有WHERE
子句,那就太好了
有什么想法吗?蒂亚 您可以使用表变量存储要更新的ID
s:
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