Bạn không thể làm điều gì đó như thế này?
;WITH cte AS (....)
SELECT
*
FROM
cte
CROSS APPLY
dbo.myTable tbl ON cte.XXX = tbl.XXX
Đặt CROSS APPLY
sau định nghĩa CTE - thành một câu lệnh SQL duy nhất tham chiếu trở lại CTE. Nó sẽ không hoạt động ??
HOẶC: - lướt qua logic của bạn - thực hiện CTE "từ trên xuống", chọn các nút cấp cao nhất trước tiên, và sau đó lặp lại qua quá trình tìm kiếm. Bằng cách này, bạn có thể dễ dàng xác định "cha cấp cao nhất" trong phần đầu tiên của CTE đệ quy - giống như sau:
;WITH ChildParent AS
(
SELECT
ID,
ParentID = ISNULL(ParentID, -1),
SomeName,
PLevel = 1, -- defines level, 1 = TOP, 2 = immediate child nodes etc.
TopLevelFather = ID -- define "top-level" parent node
FROM dbo.[Agent_Agents]
WHERE ParentID IS NULL
UNION ALL
SELECT
a.ID,
ParentID = ISNULL(a.ParentID, -1),
a.SomeName,
PLevel = cp.PLevel + 1,
cp.TopLevelFather -- keep selecting the same value for all child nodes
FROM dbo.[Agent_Agents] a
INNER JOIN ChildParent cp ON r.ParentID = cp.ID
)
SELECT
ID,
ParentID,
SomeName,
PLevel,
TopLevelFather
FROM ChildParent
Điều này sẽ cung cấp cho bạn các nút như thế này (dựa trên dữ liệu mẫu của bạn, mở rộng một chút):
ID ParentID SomeName PLevel TopLevelFather
20 -1 Top#20 1 20
4 -1 TOP#4 1 4
8 -1 TOP#8 1 8
7 8 ChildID = 7 2 8
3 7 ChildID = 3 3 8
2 4 ChildID = 2 2 4
9 20 ChildID = 9 2 20
5 9 ChildID = 5 3 20
1 5 ChildID = 1 4 20
Bây giờ nếu bạn chọn một nút con cụ thể từ đầu ra CTE này, bạn sẽ luôn nhận được tất cả các thông tin mà bạn cần - bao gồm "cấp độ" của nút con và nút cha cấp cao nhất của nó.