Sql 物料清单查询排序

Sql 物料清单查询排序,sql,recursive-query,byte-order-mark,Sql,Recursive Query,Byte Order Mark,我正在处理文档的BOM表,因此我正在调用Bod,并且我希望以树状视图中的数据结束,因此我需要对BOM表进行分解,并按每个级别进行排序。我不知道如何使排序正确工作 我在SSMS工作 我有一个观点是正确的; [ParentDocumentTitle]、[ParentDocumentName]、[ChildDocumentTitle]、[ChildDocumentName]、[PdfilePath],所有Nvarchar 然后是SQL查询 --alter procedure [dbo].[GetBOD

我正在处理文档的BOM表,因此我正在调用Bod,并且我希望以树状视图中的数据结束,因此我需要对BOM表进行分解,并按每个级别进行排序。我不知道如何使排序正确工作

我在SSMS工作

我有一个观点是正确的; [ParentDocumentTitle]、[ParentDocumentName]、[ChildDocumentTitle]、[ChildDocumentName]、[PdfilePath],所有Nvarchar

然后是SQL查询

--alter procedure [dbo].[GetBODSummaryLevels]


IF EXISTS(SELECT [name] FROM tempdb.sys.tables WHERE [name] like '#BODSummary%') 
BEGIN
   DROP TABLE #BODSummary;
END;

DECLARE
@ParentDocTitle nvarchar(50),
@level int

SET @ParentDocTitle = 'Test Book';
SET @level = 10;

--as 
begin
WITH RPL (
[Level],
[ParentDocumentTitle], 
[ParentDocumentName],
[ChildDocumentTitle], 
[ChildDocumentName], 
[PDFFilePath]) 

AS
     (  SELECT 
            0,
            ROOT.[ParentDocumentTitle],
            ROOT.[ParentDocumentName], 
            ROOT.[ChildDocumentTitle], 
            ROOT.[ChildDocumentName],
            ROOT.[PDFFilePath]
        FROM [WorkInstruictionManagerDB].[dbo].[BOD] ROOT
        WHERE ROOT.[ParentDocumentTitle] = @ParentDocTitle
      UNION ALL
        SELECT 
            Parent.Level+1,
            CHILD.[ParentDocumentTitle], 
            CHILD.[ParentDocumentName], 
            CHILD.[ChildDocumentTitle], 
            CHILD.[ChildDocumentName], 
            CHILD.[PDFFilePath]
        FROM RPL PARENT, [WorkInstruictionManagerDB].[dbo].[BOD] CHILD
        WHERE  PARENT.[ChildDocumentTitle] = CHILD.[ParentDocumentTitle]and PARENT.Level<@level
     )

SELECT 
[Level] as bodlevel,
[ParentDocumentTitle] as pt, 
[ParentDocumentName] as pn, 
[ChildDocumentTitle] as ct,
[ChildDocumentName] as cn,
[PDFFilePath] as pdf

into #BODSummary
FROM RPL
Select * From #BODSummary 
end
这提供了正确的信息,但我不知道如何对这些信息进行排序,使子项显示在父项下面


我遗漏了什么,或者干脆做错了什么?

所有子行中都可以有根父id。然后按根id和级别对行进行排序

请试试这个:

--alter procedure [dbo].[GetBODSummaryLevels]


IF EXISTS(SELECT [name] FROM tempdb.sys.tables WHERE [name] like '#BODSummary%') 
BEGIN
   DROP TABLE #BODSummary;
END;

DECLARE
@ParentDocTitle nvarchar(50),
@level int

SET @ParentDocTitle = 'Test Book';
SET @level = 10;

--as 
begin
WITH RPL (
[RootID],
[Level],
[ParentDocumentTitle], 
[ParentDocumentName],
[ChildDocumentTitle], 
[ChildDocumentName], 
[PDFFilePath]) 

AS
     (  SELECT 
            ROOT.[ChildDocumentTitle]  RootID
            0 Level,
            ROOT.[ParentDocumentTitle],
            ROOT.[ParentDocumentName], 
            ROOT.[ChildDocumentTitle], 
            ROOT.[ChildDocumentName],
            ROOT.[PDFFilePath]
        FROM [WorkInstruictionManagerDB].[dbo].[BOD] ROOT
        WHERE ROOT.[ParentDocumentTitle] = @ParentDocTitle
      UNION ALL
        SELECT 
            CHILD.[ParentDocumentTitle] RootID
            Parent.Level+1,
            CHILD.[ParentDocumentTitle], 
            CHILD.[ParentDocumentName], 
            CHILD.[ChildDocumentTitle], 
            CHILD.[ChildDocumentName], 
            CHILD.[PDFFilePath]
        FROM RPL PARENT, [WorkInstruictionManagerDB].[dbo].[BOD] CHILD
        WHERE  PARENT.[ChildDocumentTitle] = CHILD.[ParentDocumentTitle]and PARENT.Level<@level
     )

SELECT 
[Level] as bodlevel,
[ParentDocumentTitle] as pt, 
[ParentDocumentName] as pn, 
[ChildDocumentTitle] as ct,
[ChildDocumentName] as cn,
[PDFFilePath] as pdf

into #BODSummary
FROM RPL
Select * From #BODSummary
order by RootID,Level
end

建立一个层次路径并按其排序。有点

WITH RPL (
[Level],
[ParentDocumentTitle], 
[ParentDocumentName],
[ChildDocumentTitle], 
[ChildDocumentName], 
[PDFFilePath],
hierarchypath ) 

AS
     (  SELECT 
            0,
            ROOT.[ParentDocumentTitle],
            ROOT.[ParentDocumentName], 
            ROOT.[ChildDocumentTitle], 
            ROOT.[ChildDocumentName],
            ROOT.[PDFFilePath],
            convert(varchar(max), ROOT.[ChildDocumentTitle]) 
        FROM [WorkInstruictionManagerDB].[dbo].[BOD] ROOT
        WHERE ROOT.[ParentDocumentTitle] = @ParentDocTitle
      UNION ALL
        SELECT 
            Parent.Level+1,
            CHILD.[ParentDocumentTitle], 
            CHILD.[ParentDocumentName], 
            CHILD.[ChildDocumentTitle], 
            CHILD.[ChildDocumentName], 
            CHILD.[PDFFilePath],
            hierarchypath  + '->' + CHILD.[ParentDocumentTitle]
        FROM RPL PARENT
        JOIN [WorkInstruictionManagerDB].[dbo].[BOD] CHILD
          ON  PARENT.[ChildDocumentTitle] = CHILD.[ParentDocumentTitle] and PARENT.Level<@level
     )

SELECT 
[Level] as bodlevel,
[ParentDocumentTitle] as pt, 
[ParentDocumentName] as pn, 
[ChildDocumentTitle] as ct,
[ChildDocumentName] as cn,
[PDFFilePath] as pdf,
hierarchypath
into #BODSummary
FROM RPL;

Select * 
From #BODSummary 
order by hierarchypath desc -- children first

您已经具有级别,并且您知道0是父级。那么你试着排序什么呢?我试着使用group by和order by任意数量的字段,但我最终得到的是数字顺序,但我需要文档的层次顺序,我无法理解这添加了RootID,但它仍然没有按照我正在寻找的层次顺序排序。请您将样本数据与所需的输出共享,以便更好地理解?请尝试我的修订答案谢谢您的帮助!我现在能够实现另一个答案,并且它的工作符合我的要求,很高兴知道这一点。不客气。祝你一切顺利,谢谢!我今天就可以实现了,效果非常好!