2013-04-29 3 views
0

Я пытаюсь запустить простой рекурсивный запрос SQL Server 2008.Рекурсивный запрос SQL возвращает только последнюю строку

После этих примеров: http://msdn.microsoft.com/en-us/library/ms186243.aspx и SQL Server recursive query

У меня есть таблица, с идентификатором и ParentID:

ID fParent fName 
2 NULL  root 
3 2  Drug_Error 
4 2  Incident 
5 4  2007 
6 4  2009 
7 5  2007-1 
8 7  2008-2 

с помощью следующего запроса

with recury as (
Select 
fs1.ID ,fs1.FParent,fs1.FName 
from FoldersStructure as fs1 
where fs1.FParent =null 
union all 
select fs2.id,fs2.FParent,fs2.FName 
from FoldersStructure as fs2 
inner join recury as r on fs2.FParent= r.ID 
) 
select ID,FParent,FName 
from recury 
where ID=8 

Я надеялся получить:

2 null root 
4 2  incident 
5 4  2007 
7 5  2007-1 
8 7  2007-2 

Но я получаю только последний. благодарит заранее.

+2

Вы пробовали опуская свой ИНЕКЕ? В нем конкретно говорится, что вы получите только последний ряд. –

+0

@DaveJohnson, если я удалю, где ID = 8, я получаю каждую строку в таблице. – Lambda

+0

Имена столбцов, выбранных в CTE, не соответствуют именам столбцов в таблице примеров! –

ответ

2

Удалите ИНЕК из заявления, поскольку он ограничивает результирующий к строкам, где Id = 8. На основе первого комментария ниже, теперь я понимаю ваше требование! Для использования 8 в качестве отправной точки и получить все родительские строки:

WITH recury (Id, ParentId, Name, Level) AS 
(
    SELECT fs1.Id ,fs1.ParentId,fs1.Name, CONVERT(int, 0) 
    FROM FoldersStructure AS fs1 
    WHERE fs1.Id = 8 
    UNION ALL 
    SELECT fs2.Id,fs2.ParentId,fs2.Name, Level - 1 
    FROM FoldersStructure AS fs2 
    JOIN recury AS r ON fs2.Id = r.ParentId 
) 
SELECT Id, ParentId, Name, Level 
FROM recury 
ORDER BY Level; 

Этот код будет работать, если Идентификаторы родительских строк не в числовом порядке. Если ваши родительские строки всегда гарантированы в числовом порядке, вы можете опустить столбец Level, введенный в CTE, и отсортировать по столбцу Id вместо этого, как в ответе bummi.

SQL скрипку пример: http://sqlfiddle.com/#!3/2af0c/4

+0

, но если я удалю, где Id = 8, как он может найти начальную точку? – Lambda

+0

@ Lambda: Я обновил свой ответ в ответ на ваш комментарий. –

+0

Отлично, что сработало Слишком, большое спасибо, они в численном порядке. Но я буду использовать ваш уровень, чтобы быть в безопасности. – Lambda

4
with recury as (
Select 
fs1.ID ,fs1.FParent,fs1.FName 
from FoldersStructure as fs1 
where fs1.ID=8 

union all 
select fs2.id,fs2.FParent,fs2.FName 
from FoldersStructure as fs2 
inner join recury as r on fs2.ID= r.FParent 

) 
select ID,FParent,FName 
from recury 
order by ID 

SQL-Fiddle

+0

Спасибо, вы сохранили мой день, ваш правый его fs2.ID = r.FParent – Lambda

Смежные вопросы