2016-02-04 73 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