【问题标题】:CTE BOM query OrderingCTE BOM查询订购
【发布时间】:2021-04-07 16:39:59
【问题描述】:

我正在处理 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], 
[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

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

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

【问题讨论】:

  • 您已经拥有Level 并且您知道0 是父级。那么你尝试排序的是什么?
  • 我尝试使用 group by 和 order by 任意数量的字段,但我最终得到了数字顺序,但我需要文档按层次顺序排列,我无法弄清楚

标签: sql recursive-query byte-order-mark


【解决方案1】:

构建层次结构路径并按其排序。种

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

【讨论】:

  • 谢谢!我今天能够实现它并且效果很好!
【解决方案2】:

您可以在所有子行中拥有根父 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

【讨论】:

  • 这添加了 RootID,但它仍然没有按我正在寻找的层次顺序排序
  • 您能否分享带有所需输出的样本数据以便更好地理解?
  • 轻松尝试我修改后的答案
  • 感谢您的帮助!我现在能够根据需要实现其他答案及其工作
  • 很高兴知道。不用客气。最好的祝愿。
猜你喜欢
  • 1970-01-01
  • 2017-05-06
  • 1970-01-01
  • 1970-01-01
  • 2013-01-17
  • 1970-01-01
  • 2016-12-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多