Вложенный путь JSON

#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')