SQL Server: выберите Parent-Child

У меня есть SQL Server 2008 с таблицей под названием ProductCategories, разработанной следующим образом:

Id | Name      | ParentId
71   PCs         NULL
32   MACs        NULL
 3   Keyboard    1
 9   Mouse       1
 5   Screen      1
11   Keyboard    2
 7   Mouse       2
 8   Screen      2

Я хотел бы выбрать из этой таблицы, и получить набор результатов, как это:

Id | Name      | ParentId
71   PCs         NULL
 3   Keyboard    1
 9   Mouse       1
 5   Screen      1
32   MACs        NULL
11   Keyboard    2
 7   Mouse       2
 8   Screen      2

Я попробовал это, но это, очевидно, дает мне те, у которых нет ParentId:

WITH Hierarchy
AS
(
    SELECT 
        T1.Id, T1.ParentId
    FROM
        ProductCategories T1
    WHERE 
        T1.parentid IS NULL OR 
        T1.parentid IN (SELECT id from ProductCategories WHERE parentid IS NULL)
    UNION ALL
    SELECT 
        T1.Id, T1.ParentId
    FROM
        ProductCategories T1
    INNER JOIN 
        Hierarchy TH ON TH.Id = T1.ParentId
)
select *
from Hierarchy 
order by parentid

Пожалуйста, помогите мне, если можете:)

-парень, который не знает SQL

2 ответа

Решение

Попробуй это:

Select Id, Name, ParentId
From ProductCategories
Order By Coalesce(ParentId, Id), 
   Coalesce(ParentId, 0), Name

Три заказа по пунктам,

  1. Coalesce (ParentId, Id): группирует записи по родителю как для самого родителя, так и для всех потомков этого родителя.
  2. Coalesce(ParentId, 0) Эта группа в каждом наборе, так что одна запись с нулевым родителем (родитель) сортируется в верхней части группы
  3. Имя, это сортирует детей в группе по имени

Попробуй это

SELECT id, name, parentId 
FROM categories
ORDER BY ISNULL(parentId,id), id

Кстати, не должны ли первые два индекса в вашей таблице быть 1 и 2, а не 71 и 32?

Другие вопросы по тегам