Sql 物料清单查询排序
我正在处理文档的BOM表,因此我正在调用Bod,并且我希望以树状视图中的数据结束,因此我需要对BOM表进行分解,并按每个级别进行排序。我不知道如何使排序正确工作 我在SSMS工作 我有一个观点是正确的; [ParentDocumentTitle]、[ParentDocumentName]、[ChildDocumentTitle]、[ChildDocumentName]、[PdfilePath],所有Nvarchar 然后是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
--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,但它仍然没有按照我正在寻找的层次顺序排序。请您将样本数据与所需的输出共享,以便更好地理解?请尝试我的修订答案谢谢您的帮助!我现在能够实现另一个答案,并且它的工作符合我的要求,很高兴知道这一点。不客气。祝你一切顺利,谢谢!我今天就可以实现了,效果非常好!