如何使用row_number()在Master-Detail中使用增量编号更新列Num?

时间:2017-08-06 11:38:06

标签: sql sql-server tsql

我想用增量号更新我的专栏Acc.DocHeader.Num和Acc.DocItem.Num。我有:

UPDATE x
SET x.Num = x.newNum,x.iNum=x.newNum
FROM (
      SELECT Num,iNum, ROW_NUMBER() OVER (ORDER BY DocCreateDate ,DailyNum) AS newNum
      FROM (SELECT h.Num,h.DocCreateDate,h.DailyNum,i.Num iNum FROM Acc.DocHeader h INNER JOIN Acc.DocItem i ON i.DocHeaderRef = h.Id WHERE h.Year = 1395 AND h.BranchRef = 1) AS header
      ) x

为什么我会获得Derived table' x'是不可更新的,因为修改会影响多个基表?

DocHeader表:

Id      Num     Year        DocCreateDate       
-------------------------------------------------------
1       NULL        1396        2016-03-20
2       NULL        1395        2016-04-02
3       NULL        1395        2016-04-05
4       NULL        1395        2016-04-10

DocItem表:

Id      Num     DocHeaderRef
----------------------------------------------
1       NULL        1
2       NULL        1
3       NULL        1
4       NULL        4
5       NULL        4
6       NULL        3
7       NULL        3
8       NULL        3

输出:

DocHeader表:

Id      Num     Year        DocCreateDate       
-------------------------------------------------------
1       1       1396        2016-03-20
2       1       1395        2016-04-02
3       2       1395        2016-04-05
4       3       1395        2016-04-10

DocItem表:

Id      Num     DocHeaderRef
----------------------------------------------
1       1       1
2       1       1
3       1       1
4       3       4
5       3       4
6       4       3
7       4       3
8       4       3

1 个答案:

答案 0 :(得分:4)

您正尝试在单个update语句中更新两个不同表中的列:

  • Num来自Acc.DocHeader
  • iNum来自Acc.DocItem

在SQL Server中,您只能在UPDATE中一次更新一个表。

您可以在一个事务中更新多个表。您还可以使用OUTPUT子句捕获正在更新的行中的值。这回答了为什么你不能做你想做的事情的问题。

我发现你的查询有点难以理解 - 而你的问题并不能解释你想要做什么 - 所以很难提出替代方案。