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