Я бы хотел получить самый верхний предок (корень) иерархии на любом уровне данных.
Вот моя таблица.
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», если я введу «A.1» в качестве ввода, также возвращаемое значение будет «A», если я предоставлю «A.3.3» в качестве ввода. Также возвращаемое значение будет «A», если параметр «A.3.3.3.1»
Я написал что-то вроде этого, но я не уверен, как продолжить после этого.
;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