我正在尝试在 Select 语句中添加一列,该列可以将腿编号分配给我拥有的三个腿。支线编号始终分配在 1 级,没有特定的顺序。
注意:我的实际数据是随机的6位ID,而不是编号1,2,3,4...
数据:
declare @mytable table(id int, parent_id int, level int)
INSERT INTO @MYTABLE VALUES(1, NULL, 0)
INSERT INTO @MYTABLE VALUES(2, 1, 1)
INSERT INTO @MYTABLE VALUES(3, 1, 1)
INSERT INTO @MYTABLE VALUES(4, 1, 1)
INSERT INTO @MYTABLE VALUES(5, 2, 2)
INSERT INTO @MYTABLE VALUES(6, 2, 2)
INSERT INTO @MYTABLE VALUES(7, 4, 2)
INSERT INTO @MYTABLE VALUES(8, 4, 2)
INSERT INTO @MYTABLE VALUES(9, 4, 2)
INSERT INTO @MYTABLE VALUES(10, 4, 2)
INSERT INTO @MYTABLE VALUES(11, 6, 3)
INSERT INTO @MYTABLE VALUES(12, 6, 3)
INSERT INTO @MYTABLE VALUES(13, 12, 4)
INSERT INTO @MYTABLE VALUES(14, 12, 4)
INSERT INTO @MYTABLE VALUES(15, 12, 4)
INSERT INTO @MYTABLE VALUES(16, 10, 3)
INSERT INTO @MYTABLE VALUES(17, 10, 3)
INSERT INTO @MYTABLE VALUES(18, 10, 3)
INSERT INTO @MYTABLE VALUES(19, 13, 5)
INSERT INTO @MYTABLE VALUES(20, 13, 5)
INSERT INTO @MYTABLE VALUES(21, 13, 5)
INSERT INTO @MYTABLE VALUES(22, 17, 4)
INSERT INTO @MYTABLE VALUES(23, 17, 4)
;
select
b.id,
b.parent_id,
b.level
from @mytable b
很好的挑战。给你!
WITH cte AS
(
SELECT m.id
,m.parent_id
,0 AS Lev
,CAST(NULL AS BIGINT) AS Leg
FROM @mytable AS m
WHERE m.parent_id IS NULL
UNION ALL
SELECT cc.id
,cc.parent_id
,c.Lev + 1
,CASE
WHEN c.Lev + 1 = 1 THEN ROW_NUMBER() OVER (ORDER BY c.Lev + 1)
ELSE c.Leg
END AS Leg
FROM cte AS c
INNER JOIN @mytable AS cc ON cc.parent_id = c.id
)
SELECT cte.id
,cte.parent_id
,cte.Lev
,cte.Leg
FROM cte
ORDER BY cte.id