我有一个看起来像这样的层次结构:
作为 TSQL 中的 JSON,它是这样的:
declare @Employees nvarchar(max) =
'{
"person": "Amy",
"staff": [
{ "person": "Bill" },
{
"person": "Chris",
"staff": [
{ "person": "Dan" },
{ "person": "Emma" }
]
}
]
}';
这只是一个例子。实际数据可以是任何深度或宽度不确定的树。
我发现的文档和所有示例都显示了自上而下的遍历。每个 JSON 路径都从根节点开始,并通过已知节点名称导航到所需节点。我没有发现从层次结构中的不确定深度开始向上工作。我觉得我需要像传递闭包这样的东西。
给定一个名字,我想得到这个名字的祖先。例如,给定“Emma”,结果将是“Emma / Chris / Amy”。给定“Bill”,答案将是“Bill / Amy”。输出格式不重要;它可以是 JSON、字符串或结果集。名字是独一无二的。
这是我自己的学习练习。可以将原始 JSON 表示更改为任何等效的表示,只要它仍然是 JSONy。在层次结构的邻接列表表示上的 JSON_QUERY 不会达到我的目标。
在我看来,这似乎是一个非常普通的递归查询,只要您动态地解开 JSON。
db<>fiddle
以前,更简单的 db<>fiddle
内联或捆绑到函数中运行,您可以解析出每个节点的 JSON 路径以及相应的父路径。
您可以使用OPENJSON和 CTE 来提取每个人及其相关人员:
回报: