Sql-Server
創建父節點和父id
我有一個包含
id
、nodeid
、nodevalue
和nodelevel
列的表。現在我想創建新的臨時列ParentnodeId
。我嘗試使用 CTE,但沒有得到正確的結果。
Id Nodeid NodeLevel Nodevalue ParentId 1 100 1 節點值1 0 2 200 2 節點值2 1 3 300 3 節點值3 2 4 400 4 節點值4 3 5 500 5 節點值5 4 6 600 6 節點值6 5 7 700 6 節點值7 5 8 800 5 節點值8 4 9 900 6 節點值9 5 10 1000 5 節點值10 4 11 1100 6 節點值11 5 12 1200 6 節點值12 5 13 1300 6 節點值13 5 14 1400 6 節點值14 5 15 1500 6 節點值15 5 16 1600 5 節點值16 4 17 1700 6 節點值17 5 18 1800 6 節點值18 5 19 1900 7 節點值19 6 20 2000 7 節點值20 6 21 2100 8 節點值21 7 22 2200 9 節點值22 8 23 2300 9 節點值23 8 24 2400 9 節點值24 8 25 2500 7 節點值25 6
with parentId as ( select Id, Nodeid, NodeLevel, Nodevalue, NodeLevel - 1 as ParentId from table1) , parentnode as ( select Id, Nodeid, NodeLevel, Nodevalue, ParentId, CAST(NULL as nvarchar(50))as ParentNode from parentId as pId where NodeLevel = 1 union all select pId1.Id, pId1.Nodeid, pId1.NodeLevel, pId1.Nodevalue, pId1.ParentId, CAST(pn.MruHierarchyNode as nvarchar(50))as ParentNode from parentId as pId1 inner join parentnode as pn on pn.Id = pId1.ParentId) select * from parentnode order by Nodeid
我可以理解我
ParentId
使用 ( ) 錯誤地創建了列nodelevel-1
,這就是遞歸部分內部連接中的問題。誰能幫我得到正確的
Parentid
和ParentNode
?父級應該是以下行:
- 這
nodeLevel
是目前行的nodeLevel - 1
- 是小於目前行的
Id
最高值Id``Id
例如,id 9 的父 id 應為 8(如果您檢查節點級別),id 11 到 15 的父 id 應為 10。
sqlfiddle在這裡
使用 OP 提供的 SQLFiddle,並將他的註釋解釋為給定的父級是
nodeLevel
比目前行小一的行nodeLevel
,並且仍然小於目前行的Id
最高行,我只是修改了得到的查詢所以它遵循這些規則:Id``Id``ParentId
with parentId as ( select Id, Nodeid, NodeLevel, Nodevalue, p.ParentId from table1 c CROSS APPLY (SELECT MAX(Id) as ParentId FROM table1 WHERE nodeLevel = c.nodeLevel - 1 AND Id < c.Id ) p )
結果表明,具有
Id
9 的行確實有 8 作為其父級,而Id
= 11 - 16 的行確實有 10 作為其父級。這是修改後的SQLFiddle