Sql server 如何使用SQL Server从任何层次结构级别获取层次结构查询中的根
我想从任何级别的数据中获取层次结构的最上层祖先根。 下面是我的桌子Sql server 如何使用SQL Server从任何层次结构级别获取层次结构查询中的根,sql-server,tsql,common-table-expression,recursive-query,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
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
你在正确的方向上,你只需要最后一次推 与使用从根节点遍历到叶节点的标准递归cte不同,您可以反转该过程并从输入节点遍历回根节点。 然后它就是ORDERBY子句中具有级别desc的top 1:
DECLARE @GRP NVARCHAR(40) = 'A.3.3.3.1';
WITH items AS (
SELECT G.GRP,
ISNULL(G.PARENTGRP, '') AS ParentGroup,
0 AS Level
FROM #SMGROUP G
WHERE G.GRP = @GRP
UNION ALL
SELECT G.GRP,
G.PARENTGRP,
Level + 1
FROM #SMGROUP G
INNER JOIN items itms
ON itms.ParentGroup = G.GRP
)
SELECT TOP 1 Grp
FROM items
ORDER BY Level DESC