2014-11-19 4 views
0

Мне нужно запустить отчет на сервере Production Server (SQL Server) завтра. Поскольку я не очень уверен в CTE и нуждаюсь в быстрой помощи, я ставил свой вопрос здесь.Найти конечный родитель с помощью CTE

У меня есть структуру таблицы что-то вроде этого:

Таблица:

UnderLyingConstituentMap 
{ 
ParentUnderLyingId int not null, 
UnderLyingId int 
} 

UnderLying Один может быть частью более чем одного ParentUnderLying. Так что это отношение много-много. Мне дается набор UnderLyingId s и вам нужно найти все конечные ParentUnderLyingId.

Может быть UnderLying s, не имеющими родителей. Тогда они не будут существовать в столбце UnderLyingId этой таблицы.

Пожалуйста, помогите мне с запросом CTE.

ответ

0

Использование Рекурсивный присоединиться Вроде как ниже:

WITH UserCTE AS (
    SELECT UnderLyingId ,ParentUnderLyingId 
    FROM dbo.UnderLyingConstituentMap 
    WHERE UnderLyingId = 1 

    UNION ALL 

    SELECT UnderLyingId ,ParentUnderLyingId 
    FROM UserCTE AS usr 
    INNER JOIN dbo.UnderLyingConstituentMap AS mgr 
     ON usr.ParentUnderLyingId = mgr.UnderLyingId 
) 
SELECT * FROM UserCTE AS u; 
0

Попробуйте с ниже Query

;WITH cte1 
as 
(
    SELECT ParentUnderLyingId,UnderLyingId, 0 AS level , 
    convert(varchar(100), '<'+convert(varchar(3),UnderLyingId)+'>') as Visited 
    FROM #UnderLyingConstituentMap 

    UNION ALL 

    SELECT T.ParentUnderLyingId,T.UnderLyingId, level +1 , 
    Convert(varchar(100),Visited +'<'+convert(varchar(3),cte1.ParentUnderLyingId)+'>') 
    FROM #UnderLyingConstituentMap T 
    INNER JOIN cte1 
    on t.UnderLyingId=cte1.ParentUnderLyingId 
    WHERE Visited NOT LIKE ('%<'+convert(varchar(3),t.ParentUnderLyingId)+'>%') 
) 
SELECT * FROM cte1