Nếu tất cả những gì bạn muốn làm với trường cấp của mình là giới hạn số lần đệ quy, bạn có thể sử dụng MAXRECURSION
gợi ý truy vấn
, một cái gì đó như thế này:
WITH Department_CTE AS
(
SELECT
DepartmentGroupKey,
ParentDepartmentGroupKey,
DepartmentGroupName
FROM dimDepartmentGroup
WHERE DepartmentGroupKey = 2
UNION ALL
SELECT
Child.DepartmentGroupKey,
Child.ParentDepartmentGroupKey,
Child.DepartmentGroupName
FROM Department_CTE AS Parent
JOIN DimDepartmentGroup AS Child
ON Parent.ParentDepartmentGroupKey = Child.DepartmentGroupKey
)
SELECT * FROM Department_CTE
OPTION (MAXRECURSION 2)
Chỉnh sửa:
Trả lời cho câu hỏi trong phần nhận xét, không, bạn không thể loại bỏ lỗi bạn gặp phải khi lặp lại nhiều lần hơn cài đặt MAXRECURSION của bạn cho phép. Nếu tôi hiểu đúng về bạn, bạn có thể làm như sau:
WITH CTE AS
(
-- Start CTE off by selecting the task that was provided to stored procedure.
SELECT Id, 0 as [Level]
FROM [dbo].[TestTable]
WHERE [Id] = 1
-- Recursively add tasks that are children of parent tasks that have already been found in previous iterations.
UNION ALL
SELECT t.Id, [Level] + 1
FROM [dbo].[TestTable] as t
INNER JOIN CTE as tcte
ON t.[ParentId] = tcte.[Id]
WHERE [Level] < 2
),
CTE2 AS
(
SELECT TestTable.*
FROM CTE
INNER JOIN TestTable ON CTE.Id = TestTable.Id
)
SELECT * FROM CTE2;
Điều này cũng phải chung chung như những gì bạn có ở trên, giả sử bạn không có kế hoạch thay đổi các trường phân cấp hoặc khóa chính.