2013-05-17 7 views
2

У меня есть таблица category, как показано ниже:Родительский ребенок Результат с сервера sql?

id  title  ParentID 
1  C1   0 
2  C2   0 
3  C3   0 
4  C4   2 
5  C5   1 
6  C6   3 
7  C7   4 

Я хочу привести в качестве

id title  ParentID Level 
1 C1   0   0 
5 C5   1   1 
2 C2   0   0 
4 C4   2   1 
7 C7   4   2 
3 C3   0   0 
6 C6   3   1 

Как я могу получить этот результат?

Объяснение: Я хочу получить результат с элементами ниже их родительского элемента.

+7

[ 'ORDER BY случае, когда ParentID = 0 THEN id ELSE ParentID END'] (http://sqlfiddle.com/#!6/d183a/1) –

+0

Я пытаюсь чтобы увидеть логику в заказе, который вы запрашиваете, я не вижу никакой комбинации id, title или parentID, если вам не хватает таблицы, в которую вы тоже присоединяетесь –

+0

Я хочу, чтобы результат был как элемент ниже его родительского элемента. – manoj

ответ

4

Этот ответ предполагает, что вы используете SQL Server 2008 или более позднюю версию.

Используйте рекурсивный CTE и создайте строку идентификаторов, которые вы используете в порядке как hierarchy id.

with C as 
(
    select id, 
     title, 
     parentid, 
     '/'+cast(id as varchar(max))+'/' as sort, 
     1 as lvl 
    from YourTable 
    where parentid = 0 
    union all 
    select T.id, 
     T.title, 
     T.parentid, 
     C.sort + cast(T.id as varchar(10)) + '/', 
     C.lvl + 1 
    from YourTable as T 
    inner join C 
     on T.parentid = C.id 
) 
select id, 
     title, 
     parentid, 
     lvl, 
     sort 
from C 
order by cast(sort as hierarchyid) 

SQL Fiddle

3

С рекурсивным КТР, который в основном строит материализованного пути от корня элементов к элементам:

; WITH cte 
    (id, title, parentID, path) 
AS 
(SELECT 
     id, 
     title, 
     parentID, 
     CAST(RIGHT(REPLICATE('0',9) 
       + CAST(id AS VARCHAR(10)) 
       ,10) AS VARCHAR(MAX)) 
    FROM 
     category 
    WHERE 
     parentID = 0 
UNION ALL 
    SELECT 
     a.id, 
     a.title, 
     a.parentID, 
     CAST(b.path 
      + RIGHT(REPLICATE('0',9) 
        + CAST(a.id AS VARCHAR(10)) 
        ,10) AS VARCHAR(MAX)) 
    FROM 
     category AS a 
    JOIN 
     cte AS b 
     ON b.id = a.parentID 
) 
SELECT id, title, parentID 
FROM cte 
ORDER BY path ; 

Тест на SQL-Fiddle

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