Eu preciso construir um json com base nos resultados de duas consultas diferentes na mesma tabela, onde uma junção é irrelevante.
Considere o seguinte exemplo ( demo completa está aqui ):
CREATE TABLE Trees
(
[Id] INT,
[Type] NVARCHAR(100),
[Height] DECIMAL(2,1)
);
INSERT INTO Trees ([Id], [Type], [Height])
VALUES
(1, 'Palm', 5.5),
(2, 'Pine', 6.2),
(3, 'Apple', 2.5),
(4, 'Japanese Cedar', 0.5),
(5, 'Spanish Fir', 0.6);
Eu quero construir o seguinte json:
{
"highTrees":
[
{
"id": 1,
"type": "Palm",
"height": 5.5
},
{
"id": 1,
"type": "Pine",
"height": 6.2
}
],
"lowTrees":
[
{
"id": 4,
"type": "Japanese Cedar",
"height": 0.5
},
{
"id": 5,
"type": "Spanish Fir",
"height": 0.6
}
]
}
Eu tentei isso:
SELECT
Id as 'highTrees.id',
Type as 'highTrees.type',
Height as 'highTrees.height'
FROM Trees WHERE [Height] > 5
UNION ALL
SELECT
Id as 'lowTrees.id',
Type as 'lowTrees.type',
Height as 'lowTrees.height'
FROM Trees WHERE [Height] < 1
FOR JSON PATH;
Mas obviamente esse não é o caminho a seguir, pois fornece isso:
[
{
"highTrees": {
"id": 1,
"type": "Palm",
"height": 5.5
}
},
{
"highTrees": {
"id": 2,
"type": "Pine",
"height": 6.2
}
},
{
"highTrees": {
"id": 4,
"type": "Japanese Cedar",
"height": 0.5
}
},
{
"highTrees": {
"id": 5,
"type": "Spanish Fir",
"height": 0.6
}
}
]
Como posso alcançar o resultado desejado?
Em seu JSON esperado,
highTrees
elowTrees
são chaves. E as chaves que você normalmente obtém das colunas. Portanto, essas devem ser colunas separadas na consulta de geração, em vez de subconjuntos separados de linhas no mesmo conjunto de linhas.Sabendo disso, você pode modificar sua
UNION
consulta assim ( demonstração ao vivo ):e obtenha (quase) a saída esperada: