2

我有一个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的家伙

4

2 回答 2

3

试试这个:

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

三个 Order By 子句,

  1. Coalesce(ParentId, Id):这个按父级对记录进行分组,包括父级本身和该父级的所有子级
  2. Coalesce(ParentId, 0) 这组在每个集合中,以便具有空父(父)的一个记录在组内排序到顶部
  3. 名称,这将按名称对组内的孩子进行排序
于 2009-09-09T13:41:46.653 回答
0

试试这个

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

顺便说一句,表中的前两个索引不应该是 1 和 2,而不是 71 和 32 吗?

于 2009-09-09T13:41:38.833 回答