我有一个字符串表,其中每个字符串代表一个地理位置,每个级别由“|”分隔。 条目并不总是具有相同的级别数,并且相同的条目可能存在多次。我预计大约。约 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,但没有成功。 有人可以帮忙吗?
你不需要代表级别就可以使用这个层次结构
使用这些 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;