Sql-Server

創建父節點和父id

  • April 21, 2017

我有一個包含idnodeidnodevaluenodelevel列的表。現在我想創建新的臨時列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,這就是遞歸部分內部連接中的問題。

誰能幫我得到正確的ParentidParentNode

父級應該是以下行:

  • 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
   )

結果表明,具有Id9 的行確實有 8 作為其父級,而Id= 11 - 16 的行確實有 10 作為其父級。

這是修改後的SQLFiddle

引用自:https://dba.stackexchange.com/questions/171415