我需要按特定顺序对查询结果进行排序。在我的表中,每条记录都有一个唯一的 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
您需要使用递归查询并按递归路径排序。像这样的事情应该给你一个很好的起点:
select
sys_connect_by_path(id, ' -> ') path
, id
, ParentID
, Name
from
SORT_ORDER
START WITH ParentID = '#'
CONNECT BY PRIOR ID = ParentID
order by path;