如何从表示位置的字符串列表中创建层次结构表?

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

我有一个字符串表,其中每个字符串代表一个地理位置,每个级别由“|”分隔。 条目并不总是具有相同的级别数,并且相同的条目可能存在多次。我预计大约。约 10000 个字符串。 200 个独特的位置信息。格式类似于此示例数据:

"Germany|Berlin|Hauptstrasse|123"
"France|Paris|CDG-Chausee"
"Germany|Munich|Bavariaplatz|234"
"Germany|Munich|Ludwigsallee"
"France|Paris|CDG-Chausee"
...(ca. 10000 more entries)

现在我需要将其转换为表示层次结构(不平衡树)的表,以便能够回答以下问题:

a) 哪些节点是给定节点的直接子节点?

e.g. "Munich"  -> Bavariaplatz, Ludwigsallee
e.g. "Germany" -> Berlin, Munich

b)在给定节点下方的树中总共有多少个(哪些)节点?

e.g. "Munich"  -> 3 (Bavariaplatz, Ludwigsallee, 234)
e.g. "Germany" -> 7 (Berlin, Munich, Hauptstrasse, Bavariaplatz, Ludwigsallee, 123, 234)

我对 MS SQL 中的“HierarchyId”类型没有经验,如果这可以帮助解决给定的问题, 但我知道我可以通过这样的表结构得到上述问题的答案:

id; name;    level; parentId; sortPath
 1; France;       1; NULL; "France"
 2; Paris;        2;    1; "France|Paris"
 3; CDG-Chausee;  3;    2; "France|Paris|CDG-Chausee"
 4; Germany;      1; NULL; "Germany" 
 5; Berlin;       2;    4; "Germany|Berlin"
 6; Hauptstrasse; 3;    5; "Germany|Berlin|Hauptstrasse"
 7; 123;          4;    6; "Germany|Berlin|Hauptstrasse|123"
 8; Munich;       2;    4; "Germany|Munich"
 9; Bavariaplatz; 3;    8; "Germany|Munich|Bavariaplatz" 
10; 234;          4;    9; "Germany|Munich|Bavariaplatz|234"
11; Ludwigsallee; 3;    8; "Germany|Munich|Ludwigsallee"

我尝试使用递归 CTE 和 Transact SQL,但没有成功。 有人可以帮忙吗?

sql-server tsql common-table-expression hierarchy
1个回答
0
投票

你不需要代表级别就可以使用这个层次结构

使用这些 culomns Id、Name、Parent(可为 Null)创建表

当没有 perant 时,perant 为 null 并获取某些具有 Id 的节点的 chilern,这是查询

WITH RECURSIVE HierarchicalCTE AS (
    SELECT Id, Name, Parent, 1 AS Level
    FROM HierarchyTable
    WHERE Id = :parent_id
    
    UNION ALL
    
    SELECT ht.Id, ht.Name, ht.Parent, hcte.Level + 1 AS Level
    FROM HierarchyTable ht
    JOIN HierarchicalCTE hcte ON ht.Parent = hcte.Id
    WHERE hcte.Level < 3  -- Specify the desired level here
)
SELECT Id, Name, Level
FROM HierarchicalCTE;
© www.soinside.com 2019 - 2024. All rights reserved.