2

У меня есть SQL Server 2008 с таблицей называется ProductCategories разработан так:SQL Server: Выберите Parent-Child

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

+0

Что (на английском) вы пытаетесь сделать? Я не могу перепроектировать ваше намерение с вывода, который вы включили. Существует бесконечное количество способов генерации этого вывода из данных, но, вероятно, очень мало того, что генерирует «правильный» вывод (который делает то, что вы хотите) из другого sdet данных ... –

+0

Как ваш результирующий набор отличается из необработанных данных в таблице, кроме недокументированного порядка сортировки? – RedFilter

+0

Чтобы это решить: эта таблица относится к самому себе? Да, похоже, это так. –

ответ

3

попробовать это:

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

Три Заказывайте статей,

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

Отлично. Только то, что я искал. – MartinHN

0

Попробуйте

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

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

+0

№ Вы можете добавлять и удалять категории, а затем продвигать новую категорию в родительскую категорию. Так будет в случае с 71 и 32. – MartinHN