CTE BOM查询订购

问题描述

我正在处理 BOM(用于文档,因此我将其称为 BOD)并且我希望以树视图结束数据,因此我需要进行 BOM 爆炸并按每个级别进行排序。我不知道如何让排序正常工作

我在 SSMS 工作

我有一个视图; [ParentDocumentTitle],[ParentDocumentName],[ChildDocumentTitle],[ChildDocumentName],[PDFFilePath], 所有 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],[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

这提供了正确的信息,但我不知道如何对这些信息进行排序,以便子项显示在父项下方。

我遗漏了什么或只是完全做错了什么?

解决方法

建立一个层次路径并按它排序。种

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
,

您可以在所有子行中都有根父 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],[PDFFilePath]) 

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

SELECT 
[Level] as bodlevel,[PDFFilePath] as pdf

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