Eu tenho uma hierarquia que se parece com isso:
Como JSON no TSQL é isso:
declare @Employees nvarchar(max) =
'{
"person": "Amy",
"staff": [
{ "person": "Bill" },
{
"person": "Chris",
"staff": [
{ "person": "Dan" },
{ "person": "Emma" }
]
}
]
}';
Este é apenas um exemplo. Os dados reais podem ser qualquer árvore de profundidade ou amplitude indeterminada.
A documentação e todos os exemplos que encontrei mostram a travessia de cima para baixo . Cada caminho JSON começa no nó raiz e navega, por nomes de nós conhecidos, em direção ao nó desejado. Não encontrei nada sobre começar em uma profundidade indeterminada dentro da hierarquia e trabalhar para cima. Sinto que preciso de algo como fechamento transitivo .
Dado um nome, gostaria de obter a ascendência para esse nome. Por exemplo, dado "Emma" o resultado será "Emma / Chris / Amy". Dado "Bill" a resposta será "Bill/Amy". O formato de saída não é importante; pode ser JSON, uma string ou um conjunto de resultados. Os nomes são únicos.
Este é um exercício de aprendizagem para mim. Não há problema em alterar a representação JSON original para algo equivalente, desde que ainda seja JSONy. Um JSON_QUERY sobre uma representação de lista de adjacências da hierarquia não atingiria meu objetivo.
Isso me parece ser uma consulta de recursão bastante simples, desde que você desembrulhe o JSON dinamicamente.
db<>fiddle
anterior, db mais simples<>fiddle
Executar em linha ou agrupado em uma função , você pode analisar o caminho JSON para cada nó com um caminho pai correspondente.
Você pode usar OPENJSON e um CTE para extrair cada pessoa e sua equipe associada:
Devoluções: