Ваш CTE, как написано, просто смутил меня, я боюсь, поэтому я переписал его следующим образом, и он дает результаты, которые вы запрашиваете. Соответствует ли это вашим требованиям?
WITH List (pairID, childId, parentId, level, originalid )
AS
(
-- Anchor member definition
select pairID, childID, parentID, 0 as level, ChildID as originalid
FROM
BusinessHeirarchy bh
where bh.PairID = 0
UNION ALL
-- Recursive member definition
select j.pairId, j.childID, j.parentID, lst.level +1 as level, lst.originalid
from BusinessHeirarchy j inner join List lst
on (lst.parentId = j.ChildID)
)
select * from list;
Очевидно, что вы можете поиграть с выходными столбцами и порядком, как вам нужно, но эти данные соответствуют тому, что вы хотите.
С моим sql нужно быть осторожным: я ограничил запрос привязки на основе нулевого пайрида, поскольку в данных вашего примера не было нулей. Это должно быть достаточно легко изменить, если вам нужна нулевая проверка, чтобы вытащить свой якорь.
Затем я просто присоединяю отношения родителя к потомку с дополнительным столбцом OriginalId, содержащим первый childId из запроса привязки.