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

Откуда:
Сообщений: 929
Хочу применить в функции, читаю и не могу врубиться, подскажите, то не так с запросом (MSSQL2005):

DECLARE @tree_sample TABLE (id int , id_parent int,nm varchar(31))
INSERT INTO @tree_sample SELECT 1 , NULL , 'ONE'
INSERT INTO @tree_sample SELECT 2 , 1      , 'TWO'
INSERT INTO @tree_sample SELECT 4 , 1      , 'FOUR'
INSERT INTO @tree_sample SELECT 7 , 4      , 'SEVEN'
INSERT INTO @tree_sample SELECT 9 , 7      , 'NINE'

;WITH tree (id,id_parent,nm)
AS 
( SELECT t.id , t.id_parent ,t.nm FROM @tree_sample AS t   WHERE t.id_parent IS NULL
  UNION ALL
  SELECT tree.id, tree.id_parent, tree.nm from tree ,@tree_sample AS tr 
                                          WHERE tree.id =  tr.id_parent AND tr.id_parent IS NOT NULL
)
SELECT * FROM tree WHERE  id_parent =1;
27 окт 17, 16:00    [20907191]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсия, простой запрос...  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
medoed
Хочу применить в функции, читаю и не могу врубиться, подскажите, то не так с запросом (MSSQL2005):

DECLARE @tree_sample TABLE (id int , id_parent int,nm varchar(31))
INSERT INTO @tree_sample SELECT 1 , NULL , 'ONE'
INSERT INTO @tree_sample SELECT 2 , 1      , 'TWO'
INSERT INTO @tree_sample SELECT 4 , 1      , 'FOUR'
INSERT INTO @tree_sample SELECT 7 , 4      , 'SEVEN'
INSERT INTO @tree_sample SELECT 9 , 7      , 'NINE'

;WITH tree (id,id_parent,nm)
AS 
( SELECT t.id , t.id_parent ,t.nm FROM @tree_sample AS t   WHERE t.id_parent IS NULL
  UNION ALL
  SELECT tree.id, tree.id_parent, tree.nm from tree ,@tree_sample AS tr 
                                          WHERE tree.id =  tr.id_parent AND tr.id_parent IS NOT NULL
)
SELECT * FROM tree WHERE  id_parent =1;
Вы в рекурсивной части выбираете те же записи, к которым присоединяетесь, поэтому каждая следующая строка равна предыдущей, вы уходите в бесконечный цикл, но с фильтром вы просто никогда не получите нужного значения (даже странно, что ошибки нет, каким то образом условие прокидывается внутрь CTE).

Вы этого хотите?

;WITH tree (id,id_parent,nm)
AS 
( SELECT t.id , t.id_parent ,t.nm FROM @tree_sample AS t   WHERE t.id_parent IS NULL
  UNION ALL
  SELECT tr.id, tr.id_parent, tr.nm from tree ,@tree_sample AS tr 
                                          WHERE tree.id =  tr.id_parent AND tr.id_parent IS NOT NULL
)
SELECT * FROM tree;
27 окт 17, 16:31    [20907326]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсия, простой запрос...  [new]
medoed
Member

Откуда:
Сообщений: 929
Minamoto,
Да, смысл теперь понятен. Спасибо!
27 окт 17, 16:34    [20907343]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить