Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于父子关系对SQL Server中的数据进行排序_Sql_Sql Server_Sql Server 2008 - Fatal编程技术网

基于父子关系对SQL Server中的数据进行排序

基于父子关系对SQL Server中的数据进行排序,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我有一个表,我在其中存储有关章节的详细信息,我必须按照索引表的顺序显示数据 第一章 1.1第一章第1页 1.2第一章第2页 第二章 2.1第二章第1页 2.2第二章第2页 第三章 标题一 标题二 标题三 3.1第三章第1页 3.2第三章第2页 3.3第三章第3页 我们可以按排序或未排序的顺序在数据库中插入数据。但数据应该根据父页面和子页面的页面顺序按排序顺序显示 我已经设置了SQL FIDLE,但由于某些原因,我无法保存SQL。下面您将找到fiddle链接和详细信息 CREATE TABLE [

我有一个表,我在其中存储有关章节的详细信息,我必须按照索引表的顺序显示数据

第一章

1.1第一章第1页

1.2第一章第2页

第二章

2.1第二章第1页

2.2第二章第2页

第三章

标题一

标题二

标题三

3.1第三章第1页

3.2第三章第2页

3.3第三章第3页

我们可以按排序或未排序的顺序在数据库中插入数据。但数据应该根据父页面和子页面的页面顺序按排序顺序显示

我已经设置了SQL FIDLE,但由于某些原因,我无法保存SQL。下面您将找到fiddle链接和详细信息

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查询正在对数据进行排序,但it子页面未正确排序子页面按其在数据库中保存的排序顺序显示

SqlFiddle链接

使用PageOrder而不是ID来构建SortCol,也可以强制转换为VARCHARMAX而不是VARBINARYMAX:

此外,章节列用于对具有相同页面顺序且属于相同树级别的章节进行排序


完整的解决方案如下


希望能有帮助

对于“12”,“第二章第2页”,2,1记录父id为2或1,您可以确认吗?因为你是第二章下的页面顺序是2,所以。是的,你是正确的,将其更改为2不会对结果造成任何更改
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
SELECT *, REPLICATE('--', CASE WHEN parentID > 0 THEN 1 ELSE 0 END) + Chapter AS PageName 
FROM Book 
ORDER BY COALESCE(NULLIF(parentID,0), id), parentID, PageOrder
SELECT * FROM
    (
     SELECT p.CategoryID
       , p.Category_Name
       , p.IsParent
       , p.ParentID
       , p.Active
       , p.Sort_Order AS Primary_Sort_Order
       , CASE WHEN p.IsParent = 0 THEN (SELECT Sort_Order FROM tbl_Category WHERE 
     CategoryID = p.ParentID) ELSE p.Sort_Order END AS Secondary_Sort_Order
      FROM tbl_Category p
    ) x
    ORDER BY Secondary_Sort_Order,
            CASE WHEN ParentID = 0 THEN CategoryID ELSE ParentID END,
CASE WHEN ParentID = 0 THEN 0 ELSE Primary_Sort_Order END, Primary_Sort_Order ASC