Sql server 如何对父节点的子节点进行唯一编号

Sql server 如何对父节点的子节点进行唯一编号,sql-server,Sql Server,我有一张这样的桌子 ID Node ParentID 1 A 0 2 B 1 3 C 1 4 D 2 5

我有一张这样的桌子

ID               Node                  ParentID
1                 A                        0
2                 B                        1
3                 C                        1
4                 D                        2
5                 E                        2
6                 F                        3
7                 G                        3
8                 H                        3 
9                 I                        4
10                J                        4
11                K                        10
12                L                        11
我需要一个查询来生成一个“位置”字段,该字段具有节点在其父节点中出现的顺序。下面的例子

ID               Node                  ParentID                  Positon
1                 A                        0                         0
2                 B                        1                         0
3                 C                        1                         1
4                 D                        2                         0
5                 E                        2                         1
6                 F                        3                         0
7                 G                        3                         1
8                 H                        3                         2 
9                 I                        4                         0
10                J                        4                         1
11                K                        10                        0
12                L                        11                        0
作为更新查询:

update  yt
set     Position = nr
from    (
        select  *
        ,       row_number() over (partition by ParentID order by ID) - 1 rn
        from    YourTable
        ) yt

要更新原始表中的位置,请将其作为子查询或CTE连接到已建议的语句:

;with cte (ID, Pos)
as (
    select ID, row_number() over (partition by ParentID order by ID) - 1
    from [Table]
)
update T
set T.Position = cte.Pos
from [Table] T
    join cte on cte.ID = T.ID

看起来不错,我该如何编写它作为更新查询来存储原始表中的位置t1无法绑定。输入错误?你可以省略连接。SQL Server足够聪明,可以通过subquery.Andomar记住表的行标识符(PK或rowid)。有兴趣,可以用上面的查询展示一个例子吗?@Andomar,我明白你的意思了(就像通过视图更新表一样,只是内联的,当然比join更紧凑,性能更好)
;with cte (ID, Pos)
as (
    select ID, row_number() over (partition by ParentID order by ID) - 1
    from [Table]
)
update T
set T.Position = cte.Pos
from [Table] T
    join cte on cte.ID = T.ID