2016-02-04 131 views
2

我有,我存儲有關章節的詳細信息的表格,我在指數下表以顯示數據排序數據

  1. 1.1章第1個

    1.2章第2頁

  2. 第二章

    2.1第二章第1頁

    2.2第二章第2頁

  3. 第三章

    標題1

    標題2

    標題三

    3.1第三章Page 1

    3.2第三章第2頁

    3.3第三章第3頁

我們所用的排序或未排序的順序插入在數據庫中的數據。但數據應該以排序的順序顯示基於父頁和子頁的pageOrder

我已經設置了SQL小提琴,但由於某種原因,我無法保存SQL。下面你會發現小提琴環節和細節

CREATE TABLE [Book] 
(
    [id] int, 
    [Chapter] varchar(20), 
    [PageOrder] int, 
    [parentID] int 
); 

INSERT INTO [Book] ([id], [Chapter], [PageOrder], [parentID]) 
VALUES 
    ('1', 'Chapter One', 1, 0), 
    ('2', 'Chapter Two', 2, 0), 
    ('3', 'Chapter Three', 3, 0), 
    ('4', 'Chapter Four', 4, 0), 
    ('5', 'Chapter Five', 5, 0), 
    ('6', 'Chapter One Page 1', 1, 1), 
    ('7', 'Chapter One Page 2', 2, 1), 
    ('8', 'Chapter One Page 3', 3, 1), 
    ('9', 'Chapter One Page 4', 4, 1), 
    ('10', 'Chapter Two Page 1', 1, 2), 
    ('11', 'Chapter Two Page 3', 3, 2), 
    ('12', 'Chapter Two Page 2', 2, 2), 
    ('13', 'Chapter Three Tite 1', 0, 3), 
    ('14', 'Chapter Three Tite 2', 0, 3), 
    ('15', 'Chapter Three Tite 3', 0, 3), 
    ('16', 'Chapter Three Page 2', 2, 3), 
    ('17', 'Chapter Three Page 3', 3, 3), 
    ('18', 'Chapter Three Page 1', 1, 3); 

WITH CTE(ID, parentID, Chapter, PageOrder, Depth, SortCol) AS 
( 
    SELECT 
     ID, parentID, Chapter, PageOrder, 0, 
     CAST(ID AS varbinary(max)) 
    FROM Book 
    WHERE parentID = 0 

    UNION ALL 

    SELECT 
     d.ID, d.parentID, d.Chapter, d.PageOrder, p.Depth + 1, 
     CAST(SortCol + CAST(d.ID AS binary(4)) AS varbinary(max)) 
    FROM Book AS d 
    JOIN CTE AS p ON d.parentID = p.ID 
) 
SELECT 
    ID, parentID, Chapter, PageOrder, Depth, 
    REPLICATE('--', Depth) + Chapter as PageName 
FROM CTE 
ORDER BY SortCol 

這CTE查詢排序數據,但子頁面沒有適當的排序子頁面在它們那裏保存在數據庫

SqlFiddle鏈接http://www.sqlfiddle.com/#!3/9770a/1排序順序顯示建立SortCol

+0

對於( '12', '第二章第2',2,1)記錄的父ID爲2或1 u能確認?因爲你是第2章所以頁面順序是2。 – Buddi

+0

是的你是正確的,事件改變拖2不會做任何改變的結果 – Learning

回答

1

使用PageOrder代替ID,也投來的VARCHAR(MAX)代替VARBINARY(MAX)

WITH CTE(ID, parentID, Chapter, PageOrder, Depth, SortCol) AS ( 
    SELECT ID, parentID, Chapter,PageOrder, 0, 
     CAST(PageOrder AS varchar(max)) 
    FROM Book 
    WHERE parentID = 0 

    UNION ALL 

    SELECT d.ID, d.parentID, d.Chapter, d.PageOrder, p.Depth + 1, 
    CAST(SortCol + CAST(d.PageOrder AS varchar(max)) AS varchar(max)) 
    FROM Book AS d 
    JOIN CTE AS p ON d.parentID = p.ID 
) 
SELECT ID, parentID, Chapter, PageOrder, Depth, SortCol, 
     REPLICATE('--', Depth) + Chapter as PageName 
FROM CTE 
ORDER BY SortCol, Chapter 

此外Chapter列用於排序具有相同PageOrder並屬於相同樹級別的章節。

Demo here

+0

謝謝,這沒有正確排序 – Learning