0

我在sql server中有病歷數據。 Follwing是我的數據heirarcy樹。獲取包含sql服務器中所有子記錄的記錄

Id  Name   ParentID 

1124 ABC   2 
1125 BCD   1124 
1126 EFG   1124 
1127 HIJ   1126 
1128 KLM   1126 
1129 OPQ   1124 
1130 RST   1124 
1131 UVW   1130 
1132 XYZ   1131 
1133 ZYA1   1124 

現在我想從上面的表中得到以下結果。在那我想從根(父母)與所有孩子直到最後一個孩子的路徑。

Id  Name ParentID PATH 

1124 ABC  2   ABC 
1125 BCD  1124  ABC/BCD 
1126 EFG  1124  ABC/EFG 
1127 HIJ  1126  ABC/EFG/HIJ 
1128 KLM  1126  ABC/EFG/KLM 
1129 OPQ  1124  ABC/OPQ 
1130 RST  1124  ABC/RST 
1131 UVW  1130  ABC/RST/UVW 
1132 XYZ  1131  ABC/RST/UVW/XYZ 
1133 ZYA1 1124  ABC/ZYA1 

因此,誰能幫我寫的SQL查詢來找出包含所有記錄從父所有載有兒童的路徑。

在此先感謝。

回答

2

您需要使用遞歸公用表表達式,然後篩選結果只對每條記錄的基本路徑(即針對ID 1131弄ABC/RST/UVW並不僅僅是ABC/RST

WITH CTE AS 
( SELECT ID, 
      Name, 
      ParentID, 
      NextParentID = ParentID, 
      Path = CAST(Name AS VARCHAR(MAX)), 
      Recursion = 1 
    FROM T 
    UNION ALL 
    SELECT CTE.ID, 
      CTE.Name, 
      CTE.ParentID, 
      T.ParentID, 
      CAST(T.Name + '/' + CTE.Path AS VARCHAR(MAX)), 
      Recursion + 1 
    FROM CTE 
      INNER JOIN T 
       ON CTE.NextParentID = T.ID 
), CTE2 AS 
( SELECT CTE.ID, 
      CTE.Name, 
      CTE.ParentID, 
      CTE.Path, 
      RowNumber = ROW_NUMBER() OVER(PARTITION BY CTE.ID ORDER BY Recursion DESC) 
    FROM CTE 
) 
SELECT ID, Name, ParentID, Path 
FROM CTE2 
WHERE RowNumber = 1; 

Example on SQL Fiddle

+0

,我運行此查詢,但它給了我錯誤「類型在遞歸查詢」CTE「的列」路徑「中的錨和遞歸部分之間不匹配。」 –

+0

我已經添加了一個CAST以確保類型一致。 – GarethD

+0

很棒@GarethD。它的工作和獲得我正在尋找的東西。謝謝。 –

0

請嘗試:

DECLARE @table as TABLE(Id INT, [Name] NVARCHAR(50), ParentID INT) 

insert into @table values 
(1124, 'ABC', 2), 
(1125, 'BCD', 1124), 
(1126, 'EFG', 1124), 
(1127, 'HIJ', 1126), 
(1128, 'KLM', 1126), 
(1129, 'OPQ', 1124), 
(1130, 'RST', 1124), 
(1131, 'UVW', 1130), 
(1132, 'XYZ', 1131), 
(1133, 'ZYA1', 1124) 

;WITH parent AS 
(
    SELECT *, convert(nvarchar(max), [Name]) as [Path] from @table WHERE ParentID = 2 
    UNION ALL 
    SELECT t.*, convert(nvarchar(max), parent.[Path]+'\'+t.[Name]) as [Path] 
    FROM parent 
    INNER JOIN @table t ON t.parentid = parent.id 
)SELECT * FROM parent 
ORDER BY ID