2

次のように設計されたProductCategoriesというテーブルを持つSQL Server 2008があります。

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

3 つの Order By 句、

  1. Coalesce(ParentId, Id): これは、親自体とその親のすべての子の両方について、親によってレコードをグループ化します
  2. Coalesce(ParentId, 0) これは各セット内でグループ化し、null の親 (親) を持つ 1 つのレコードがグループ内の一番上にソートされるようにします
  3. 名前、これはグループ内の子を名前でソートします
于 2009-09-09T13:41:46.653 に答える
0

これを試して

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

ところで、テーブルの最初の 2 つのインデックスは、 71 と 32 ではなく 1 と 2 であるべきではありませんか?

于 2009-09-09T13:41:38.833 に答える