Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Помогите разложить дерево  [new]
ИльдарSR
Member

Откуда:
Сообщений: 466
Добрый день.

Есть следующая структура

Структура таблицы следующая

Id int
ParenID int
FlmType int

SELECT * FROM Films where id = 103
SELECT * FROM Films where Parentid = 103
SELECT * FROM Films where Parentid in(SELECT Id FROM FilmDes where Parentid = 103)

на третьем запросе останавливаемся, так как это конечная запись, определяем ее по типу flmType = 4554

Пробую делать через рекурсивный CTE, но что-то у меня с ним не клеится


;with CTE
AS(
SELECT Id,ParentId,1 as level FROM Films WHERE b.Id in(SELECT branchId FROM FilmDes )
UNION ALL
SELECT b.Id,b.ParentId,level +1
FROM Films b INNER JOIN CTE c ON(b.Id = c.Id )
WHERE b.Id in(SELECT Id FROM FilmDes )
)
select * from CTE

После чего у меня вылетает ошибка, но считаю, что я пишу неправильно, так как никак не получается освоить рекурсивный CTE а додумать до правильного варианта не могу((помогите, пожалуйста

Помогите, пожалуйста
14 окт 13, 16:24    [14968077]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разложить дерево  [new]
KRS544
Member

Откуда:
Сообщений: 497
а что за вторая таблица FilmDes
14 окт 13, 16:27    [14968110]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разложить дерево  [new]
ИльдарSR
Member

Откуда:
Сообщений: 466
Вторая таблица, детализируют Films
ID - это идентификтаор из таблицы Films
14 окт 13, 16:35    [14968182]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разложить дерево  [new]
KRS544
Member

Откуда:
Сообщений: 497
Рекурсивные SQL запросы
14 окт 13, 16:50    [14968331]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разложить дерево  [new]
ИльдарSR
Member

Откуда:
Сообщений: 466
Вроде как переписал, ошибка больше не появляется

;with CTE
AS(
SELECT Id,ParentId,1 as level FROM Films b WHERE b.Id in(SELECT Id FROM FilmDes )
UNION ALL
SELECT b.Id,b.ParentId,level +1
FROM Films b INNER JOIN CTE c ON(b.Id = c.ParentId )
WHERE b.Id in(SELECT Id FROM Films )
)
select b.ID,* from CTE c inner join Branches b on c.Id = b.ID where c.ID = 94

но он не выводит весьс список, которые принадлежать Id = 94

SELECT * FROM Films where id = 94 резаслет 1 строка
SELECT * FROM Films where Parentid = 94 резаслет 9 строк
SELECT * FROM Films where Parentid in(SELECT Id FROM FilmDes where Parentid = 94) резаслет 14 строк

Подскажите, пожалуйста, что делаю не так(
14 окт 13, 17:16    [14968532]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разложить дерево  [new]
Glory
Member

Откуда:
Сообщений: 104760
;with CTE
AS(
SELECT Id,ParentId,1 as level 
    FROM Films b 
    WHERE b.Id = 94
UNION ALL
SELECT b.Id,b.ParentId,level +1
    FROM Films b 
    INNER JOIN CTE c ON b.ParentId = c.Id 
)
select b.ID,* 
    from CTE c 
    inner join Branches b on c.Id = b.ID 
14 окт 13, 17:28    [14968622]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разложить дерево  [new]
ИльдарSR
Member

Откуда:
Сообщений: 466
Спасибо большое
14 окт 13, 17:37    [14968680]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить