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