我觉得应该是一个非常简单的更新任务,但是我现在遇到了以下问题。我有一个临时表,我想从另一个表更新所有行的值为n + 1;例如:
人:
RouteData
@temp_Person:
+--------+----+
| Name | N |
+--------+----+
| A | 1 |
| A | 5 |
| A | 2 |
| B | 8 |
+--------+----+
我需要更新@temp_PersonTable,以便NPlus1列中的值派生自Person表中的N列,如:
+--------+--------+
| Name | NPlus1 |
+--------+--------+
| A | NULL |
| B | NULL |
+--------+--------+
结果将是:
UPDATE @temp_table
SET NPlus1 = ((SELECT MAX(N) FROM Person WHERE Person="A") + 1)
WHERE @temp_table.Person = Person.Name
UPDATE @temp_table
SET NPlus1 = ((SELECT MAX(N) FROM Person WHERE Person="B") + 1)
WHERE @temp_table.Person = Person.Name
我是否需要为每个案例编写单独的UPDATE语句?我想知道如何编写一个SQL脚本来遍历每个DISTINCT Name in Person并进行更新,并且目前认为这个任务更容易从单独的应用程序使用foreach循环更新表。
答案 0 :(得分:4)
您只需先将值作为子查询的一部分,然后JOIN
即可。
UPDATE tp
SET
NPlus1 = SQ.max_N + 1
FROM
@temp_Person TP
INNER JOIN (SELECT Name, MAX(N) AS max_N FROM Person GROUP BY Name) SQ ON
SQ.Name = TP.Name
答案 1 :(得分:1)
您可以使用单一陈述
update #temp_Person
set NPlus1 = (select MAX(N) + 1 from Person where Name = #temp_Person.Name)