2013-08-25 2 views
0

Эта таблица представляет иерархию категорий, а элемент в верхней части иерархии имеет родительский идентификатор как NULL. В таблице приведено в следующей exaple:Запрос цикла Sql Hierarchy

**categoryId categoryName parentId** 

1   Home   NULL 
.   .   . 
.   .   . 
20   Vehicles  1 
.   .   . 
35   SUV   20 
36   Motorbikes 20 
.   .   . 
90   BMW   35 
91   Toyota  35 
.   .   . 
234   LandCruiser 91 

Home>Vehicles>SUV>Toyota>LandCruiser 

То, что я пытаюсь сделать, это bulild вверх SQL запрос, который вернет меня обратно:

[CategoryId], [CategoryName] цепь любого данного [ CategoryId]. Он должен зацикливаться и получать каждую строку до тех пор, пока не достигнет строки с parentId == NULL.

В качестве примера выше примере 234-> 91-> 35-> 20-> 1-> NULL (STOP)

ответ

3

вы можете использовать рекурсивное ОТВ:

with cte as (
    select 
     t.categoryId, t.categoryName, t.parentId, 
     cast(t.categoryId as nvarchar(max)) as path 
    from categories as t 
    where t.categoryId = 234 

    union all 

    select 
     c.categoryId, c.categoryName, t.parentId, 
     c.path + '->' + cast(t.categoryId as nvarchar(max)) 
    from categories as t 
     inner join cte as c on c.parentId = t.categoryId 
) 
select categoryid, categoryname, path + '->NULL' 
from cte 
where parentid is null 

sql fiddle demo

+0

Там должен быть входом, например, когда мы вводим ввод как 234, запрос должен возвращать список родителей до тех пор, пока он не достигнет родителя, parentId которого равен NULL. Я попытался, но не мог понять, как изменить его. Спасибо за ответ – SamSamet

+0

@SamSamet см. Обновленный ответ и демо-версию sql-скрипта –

+0

Спасибо за ответ, который сработал отлично – SamSamet