2

SQL Server 2008中有一張桌子稱爲ProductCategories這樣設計的:SQL服務器:選擇親子

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

你想要做什麼(英文)?我不能從你包含的輸出中反向設計你的意圖。有很多方法可以從數據中生成輸出,但可能很少有這樣的方法可以根據不同的數據生成「正確」輸出(這是您想要的)... – 2009-09-09 13:37:53

+0

結果集的不同之處如何?來自表中的原始數據,而不是未記錄的排序順序? – RedFilter 2009-09-09 13:39:37

+0

要澄清這一點:這張表是指自己?是的,顯然它確實如此。 – 2009-09-09 13:40:05

回答

3

試試這個:

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

三ORDER BY子句,

  1. 合併(的ParentId,ID):由父這一個羣體的記錄,同時爲父母本身,所有的孩子該父
  2. 聚結的(的ParentId,0)在每個組中該基團,以使一個記錄與null父(父)排序頂端的組
  3. 名稱,釷內是按名稱排序組內的兒童
+0

完美。正是我在找的東西。 – MartinHN 2009-09-09 14:09:45

0

試試這個

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

順便說一句,不應該在前兩個你的表中的索引是1和2,而不是71和32?

+0

不可以。您可以添加和刪除類別,並稍後將新類別提升爲父類別。所以71和32就是這種情況。 – MartinHN 2009-09-09 14:08:36