问题描述
我正在处理 BOM(用于文档,因此我将其称为 BOD)并且我希望以树视图结束数据,因此我需要进行 BOM 爆炸并按每个级别进行排序。我不知道如何让排序正常工作
我在 SSMS 工作
我有一个视图;
[ParentDocumentTitle],[ParentDocumentName],[ChildDocumentTitle],[ChildDocumentName],[PDFFilePath],
所有 Nvarchar
--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