2015-05-24 69 views
3

我知道這裏有類似的問題,但我找不到他們的特定情況,所以我想問你,我希望你能告訴我如何這樣做最好。我有這個SQL Fiddle
我有兩個表:SQL父子查詢 - 關係在兩個表中定義

CATEGORIES (ID, 
      NAME, 
      PARENT_ID, 
      SORT_ORDER) 

而且

CATEGORY_ITEMS (ID, 
       NAME, 
       CATEGORY_ID, 
       SORT_ORDER) 

這兩個表都弄好了我真正的數據庫架構的簡歷(我沒有改變它的可能性)。在我真正的數據庫模式中,這些類別可以根據某些日期時間值定義有效的集合。 我想知道是否有可能返回如下結果與一個查詢。

|   NAME | 
|-------------------| 
|Category 1   | 
|Item 1 Category 1 | 
|Item 2 Category 1 | 
|Category 1.1  | 
|Item 1 Category 1.1|  
|Item 2 Category 1.1|  
|Category 1.2  |  
| Category 1.2.1 |  
|  Category 2 | 
|Item 1 Category 2 | 
|Item 2 Category 2 |  
| Category 2.1 |  
| Category 2.2 |   
|  Category 3 |  
| Category 3.1 |   
| Category 3.2 | 

在SQL小提琴中,您可以看到我的工作到現在爲止。我認爲我可以通過從CATEGORIES獲得我想要的樹結構到遊標中,並且對於每條記錄,我應該從CATEGORY_ITEMS獲得它的記錄,但是我想知道是否有可能在沒有遊標的情況下執行此操作。 我承認我不擅長SQL,但我正在努力做得更好,所以我才問這個問題。

回答

2

試試這個:

;WITH CTE(ID, NAME, PARENT_ID, SORT_ORDER, [Level], ord) AS (
    SELECT c.ID, CONVERT(nvarchar(100), c.NAME), 
     c.PARENT_ID, c.SORT_ORDER, 1 [level], 
     CONVERT(nvarchar(255), RIGHT('0000' + CONVERT(nvarchar(255), c.ID), 4)) AS ord 
    FROM CATEGORIES c 
    WHERE c.PARENT_ID IS NULL 
    UNION ALL 
    SELECT c.ID, CONVERT(nvarchar(100), REPLICATE(' ', [Level]) + c.NAME), 
     c.PARENT_ID, c.SORT_ORDER, CTE.[Level] + 1, 
     CONVERT(nvarchar(255),RIGHT('0000' + CONVERT(nvarchar(255), CTE.ID), 4) + RIGHT('0000' + CONVERT(nvarchar(255), c.ID), 4)) AS ord 
    FROM CATEGORIES c 
     JOIN CTE ON c.PARENT_ID = CTE.ID 
    WHERE c.PARENT_ID IS NOT NULL) 
SELECT NAME 
FROM (
    SELECT NAME, ord, 1 As ord2 
    FROM CTE 
    UNION ALL 
    SELECT ci.NAME, c.ord, 2 + ci.SORT_ORDER 
    FROM CATEGORY_ITEMS ci 
    JOIN CTE c ON ci.CATEGORY_ID = c.ID) dt 
ORDER BY ord, ord2 

對於這一點:

NAME 
Category 1 
Item 1 Category 1 
Item 2 Category 1 
    Category 1.1 
Item 1 Category 1.1 
Item 2 Category 1.1 
    Category 1.2 
    Category 1.2.1 
Category 2 
Item 1 Category 2 
Item 2 Category 2 
    Category 2.1 
    Category 2.2 
Category 3 
    Category 3.1 
    Category 3.2 
+0

非常感謝你。你的答案非常有用,它解決了我的問題。 – ordinaryDev