根据匹配值对 SQL 记录进行排序

问题描述 投票:0回答:1

我需要按特定顺序对查询结果进行排序。在我的表中,每条记录都有一个唯一的 ID。有些记录是父记录,这意味着一条记录的 ParentId 可以与另一条记录的 Id 匹配。

排序规则有点复杂,但我会尽力解释。

第一条记录必须是ParentId='#'的记录。 然后通过ParentId 属于该记录的所有记录及其子记录。 之后,ParentId='#' 的下一条记录及其子记录(以及它们的子记录)。

类似这样的:

Name              Id        ParentId

Report            L01_1     #
Finance           J13_4     L01_1
Finance Account   R45_3     J13_4
Billing           T66_5     J13_4
Cash Management   U67       L01_1
Sector-Reports    L07_7     #
Marketing         U34JK     L07_7
Market Analysis   LK89      U34JK
Giro              ZZ5       L07_7

有什么想法吗?

这是我当前的查询,我尝试创建一个临时表并将“最高”父记录排在第一位(ParentId 值:#),但这也不起作用。

我正在使用 SQL Server Management Studio。

CREATE TABLE #TempNumbering(
            Id VARCHAR(MAX),
            numbering INT
        );

        -- Numbering of records with Parent = ''#''
        INSERT INTO #TempNumbering (Id, numbering)
        SELECT Id, ROW_NUMBER() OVER (ORDER BY Id) AS numbering
        FROM #Result
        WHERE [Parent] = ''#'';


        -- Numbering of the other records based on the Parent
        INSERT INTO #TempNumbering(Id, numbering)
        SELECT r.Id, t.numbering
        FROM #Result r
        INNER JOIN #TempNumbering t ON r.[Parent] = t.Id;

        SELECT 
            39000 AS ''WFBLZ'', 
            tn.numbering,
            [Name],
            r.[Id],
            r.[Parent]
        FROM #Result r
        LEFT JOIN #TempNumbering tn ON r.Id = tn.Id


        ORDER BY numbering DESC
           
        DROP TABLE #TempNummerierung;

我得到的输出是:

Name              Id      ParentId

Report            L01_1   #
Finance           J13_4   L01_1
Cash Management   U67     L01_1
Finance Account   R45_3   J13_4
Billing           T66_5   J13_4
Sector-Reports    L07_7     #
Marketing         U34JK     L07_7
Giro              ZZ5       L07_7
Market Analysis   LK89      U34JK
sql sorting sql-order-by common-table-expression dense-rank
1个回答
0
投票

您需要使用递归查询并按递归路径排序。像这样的事情应该给你一个很好的起点:

select   
     sys_connect_by_path(id, ' -> ') path 
    , id
    , ParentID
    , Name  
 from 
      SORT_ORDER 
 START WITH ParentID = '#' 
 CONNECT BY PRIOR ID =  ParentID 
 order by path;
© www.soinside.com 2019 - 2024. All rights reserved.