Мне нужно получить корневой узел иерархической таблицы (имеет PARENT_ID = NULL):
ID | PARENT_ID
60 NULL
21 60
11 NULL
23 11
24 21
25 23
14 24
13 25
Я хочу этот результат:
ID | PARENT_ID | ROOT_ID |
-------------------------
1 NULL NULL
2 1 1
3 1 1
4 2 1
5 4 1
6 NULL NULL
7 6 6
8 7 6
Является ли CTE хорошим способом? Как я могу его создать?
Очевидно, я мог бы иметь больше одного корневого узла. Мне нужно получить корневой узел для каждого узла.
Вот что я сделал:
;WITH RCTE AS
(
SELECT ID, PARENT_ID, ID as ROOT_ID
FROM TABLE r1
WHERE NOT EXISTS (SELECT * FROM TABLE r2 WHERE r2.ID = r1.PARENT_ID)
UNION ALL
SELECT rh.ID, rh.PARENT_ID,
CASE
WHEN rc.ROOT_ID = rh.ID then NULL
ELSE ROOT_ID
END
FROM dbo.TABLE rh
INNER JOIN RCTE rc ON rc.ID = rh.PARENT_ID
)
select distinct ID, PARENT_ID,
CASE WHEN ROOT_ID = ID THEN NULL
else ROOT_ID
end ROOT_ID
from RCTE
Но вот результат:
ID | PARENT_ID | ROOT_ID |
-------------------------
11 NULL NULL
60 NULL NULL
13 25 11
23 11 11
25 23 11
13 25 60
14 24 60
21 60 60
23 11 60
24 21 60
25 23 60
Но, как видите, у меня есть несколько дубликатов:
ID | PARENT_ID | ROOT_ID |
-------------------------
13 25 60
23 11 60
25 23 60
Заранее спасибо!
select * from myTable where Parent_Id is null
? - person JohnLBevan   schedule 10.10.2018