如何从任何层次结构中使用SQL Server在层次结构查询中获取根

时间:2019-07-08 09:50:57

标签: sql-server tsql common-table-expression recursive-query

我想从任何级别的数据中获取层次结构的最高祖先(根)。 以下是我的桌子。

CREATE TABLE #SMGROUP (ID INT NOT NULL, GRP NVARCHAR(40), GRPCLASS INT, PARENTGRP NVARCHAR(40), PARENTGRPCLASS INT)
INSERT INTO #SMGROUP VALUES (1, 'A', 1, NULL,NULL)
INSERT INTO #SMGROUP VALUES (1, 'B', 1, NULL,NULL)
INSERT INTO #SMGROUP VALUES (1, 'C', 1, NULL,NULL)
INSERT INTO #SMGROUP VALUES (1, 'A.1', 2, 'A',1)
INSERT INTO #SMGROUP VALUES (1, 'A.2', 2, 'A',1)
INSERT INTO #SMGROUP VALUES (1, 'A.3', 2, 'A',1)
INSERT INTO #SMGROUP VALUES (1, 'B.1', 2, 'B',1)
INSERT INTO #SMGROUP VALUES (1, 'B.2', 2, 'B',1)
INSERT INTO #SMGROUP VALUES (1, 'A.3.3', 3, 'A.3',2)
INSERT INTO #SMGROUP VALUES (1, 'A.3.3.3', 4, 'A.3.3',3)
INSERT INTO #SMGROUP VALUES (1, 'A.3.3.3.1', 5, 'A.3.3.3',4)
INSERT INTO #SMGROUP VALUES (1, 'B.1.2', 3, 'B.1',2)
INSERT INTO #SMGROUP VALUES (1, 'B.2.1', 3, 'B.2', 2)
SELECT * FROM #SMGROUP

如果我提供“ A.1”作为输入,我希望具有-“ A”的值,如果我提供“ A.3.3”作为输入,则返回值也将是“ A”。如果参数为“ A.3.3.3.1”,则返回值为“ A”

我已经写过类似的东西,但是我不确定在此之后如何继续。

;WITH items AS (
    SELECT G.GRP ,CAST('' AS NVARCHAR(30)) AS ParentGroup,
     0 AS Level    
    FROM #SMGROUP G 
    WHERE G.PARENTGRP  IS NULL  

    UNION ALL

    SELECT G.GRP, CAST(G.PARENTGRP AS NVARCHAR(30)) AS ParentGroup
    , Level + 1    
    FROM #SMGROUP G 
    INNER JOIN items itms ON itms.GRP = G.PARENTGRP 
)
SELECT * FROM items

1 个答案:

答案 0 :(得分:1)

您的方向正确,只需要最后一推即可。

您无需使用“标准”递归cte来从根节点遍历到叶节点,而是“逆向”该过程并从输入节点遍历回到根节点。 然后,它只是top 1子句中带有level desc的{​​{1}}:

order by