#sql #json #sql-server #jsonpath #for-json
Вопрос:
У меня есть таблица в следующем формате —
orderNumber | orderName
------------- ------------
1 | Pizza
1 | Pasta
Используя SQL-запрос, я ожидаю вывода в следующем формате —
{
"data": [{
"orderNumber":1,
"orders": [
{"orderName": "Pizza"},
{"orderName": "Pasta"}
]
}]
}
Но мой фактический вывод в следующем формате —
{
"data": [
{
"orderNumber": 1,
"orders" [
{"orderName": "Pizza"}
]
},
{
"orderNumber": 1,
"orders": [
{"orderName": "Pasta"}
]
}
]
}
SQL — запрос, который я использую, это —
SELECT
(SELECT orderNumber as orderNumber,
(SELECT orderName
FROM sample_table b
WHERE a.orderNumber = b.orderNumber
FOR JSON PATH) AS orders
FROM sample_table a FOR JSON PATH, ROOT('data')
) AS orderdata
Кто-нибудь может мне помочь?
Комментарии:
1. В соответствии с рекомендациями по вопросам, пожалуйста, избегайте публикации данных в виде изображений и вместо этого используйте текст. Я обновил вопрос как таковой.
2.
$.data
должен быть массив JSON, а не объект (например"data: [...]"
).
Ответ №1:
Вам нужен запрос на группировку
select
orderNumber,
(select orderName
from sample_table b
where a.orderNumber = b.orderNumber
for json path) as orders
from sample_table a
group by orderNumber
for json path, root ('data')
ВОЗВРАТ
{
"data": [
{
"orderNumber": 1,
"orders": [
{
"orderName": "Pizza"
},
{
"orderName": "Pasta"
}
]
}
]
}
Комментарии:
1. Спасибо за ответ. что делать, если в запросе есть поле без объединения, например «Имя заказа»-выберите порядковый номер, имя заказа (выберите имя заказа из таблицы образцов b, где a.Порядковый номер = b.Порядковый номер для пути json) в качестве заказов из таблицы образцов группа по порядковому номеру для пути json, корень («данные») Как справиться с вышеуказанным запросом?
2. @SaitejaSedate, не уверен, что я понимаю. Имя заказа либо агрегировано, либо нет. Это не может быть и тем и другим одновременно.
Ответ №2:
--You Can use distinct query to do so.
create table #temp
(orderNumber varchar(20),
orderName varchar(20))
insert into #temp
values('1','Pizza'),
('1','Pasta'),
('2','KFC'),('2','MACD')
select distinct(orderNumber),
(select orderName
from #temp b
where a.orderNumber = b.orderNumber
for json path) as orders
from #temp a
for json path, root ('data')