Я попытался выполнить это с помощью приведенного ниже сценария, однако это два результата запроса, которые должны быть объединены (и я не знаю, как).Но, возможно, это направит вас в правильном направлении.
DECLARE @DivisionHierarchy TABLE
(
DivisionID TINYINT NOT NULL,
DivisionName VARCHAR(20) NOT NULL,
ParentID TINYINT,
[Level] TINYINT NOT NULL,
SortOrder VARCHAR(20) NOT NULL
)
INSERT INTO @DivisionHierarchy VALUES (1, 'Division 1', NULL, 0, '1');
INSERT INTO @DivisionHierarchy VALUES (2, 'Division 2', 1, 1, '1.1');
INSERT INTO @DivisionHierarchy VALUES (3, 'Division 3', 2, 2, '1.11');
INSERT INTO @DivisionHierarchy VALUES (4, 'Division 4', 3, 3, '1.111');
INSERT INTO @DivisionHierarchy VALUES (5, 'Division 5', 2, 2, '1.12');
INSERT INTO @DivisionHierarchy VALUES (6, 'Division 6', 2, 2, '1.13');
INSERT INTO @DivisionHierarchy VALUES (7, 'Division 7', 1, 1, '1.2');
INSERT INTO @DivisionHierarchy VALUES (8, 'Division 8', NULL, 0, '2');
INSERT INTO @DivisionHierarchy VALUES (9, 'Division 9', 8, 1, '2.1');
INSERT INTO @DivisionHierarchy VALUES (10, 'Division 10', 8, 1, '2.2');
INSERT INTO @DivisionHierarchy VALUES (11, 'Division 11', 10, 2, '2.21');
SELECT * FROM @DivisionHierarchy ORDER BY DivisionID;
DECLARE @SelectedDivisions TABLE
(
DivisionID TINYINT
);
INSERT INTO @SelectedDivisions VALUES (3);
INSERT INTO @SelectedDivisions VALUES (10);
;WITH CTE
AS
(
SELECT h.*
FROM @DivisionHierarchy h
INNER JOIN @SelectedDivisions s
ON h.DivisionID = s.DivisionID
UNION ALL
SELECT h.*
FROM @DivisionHierarchy h
INNER JOIN CTE c ON c.DivisionID = h.ParentID
)
SELECT * FROM CTE ORDER BY DivisionID
;WITH CTE
AS
(
SELECT h.*
FROM @DivisionHierarchy h
INNER JOIN @SelectedDivisions s
ON h.DivisionID = s.DivisionID
UNION ALL
SELECT h.*
FROM @DivisionHierarchy h
INNER JOIN CTE c ON c.ParentID = h.DivisionID
)
SELECT * FROM CTE ORDER BY DivisionID