Как преобразовать вывод нескольких таблиц как дочерний JSON в SQL - PullRequest
2 голосов
/ 09 июля 2019

Я пытался создать объект json в SQL из трех таблиц

Основная таблица / сущность - это "порядок", который имеет идентификатор в качестве addressId

и далее таблица адресов имеет идентификатор страны и штата, который ссылается на

таблица состояний и таблицы стран

orderTable

    Id  AddressId   Status
    1     1         Processed

AddressTable

Id countryId  stateId FirstName  LastName
1    5            7     John       cena


countryTable

Id   Name
5     usa


StateTable

Id   Name
7     DC

Вывод должен отображаться как показано ниже

{
  "firstName": "John",
  "lastName": "cena",
  "Country" : {
                 "name": "usa",
                 "id" : "5"
              },
  "States" :  {
                    "name": "DC",
                    "id" : "7"
            }

}

Я пытался использовать этот запрос и получить похожие результаты, но я хочу удалить [] [] контейнеры объектов массива из json

[      // I want to remove this 
{

  "FirstName": "Steve",

  "LastName": "Gates",



     "country": 
 [       // I want to remove this 
      {

                  "name": "usa",
                 "id" : "5"
              }
       ],  // I want to remove this 

"states" :
         [  // I want to remove this 
           {
                    "name": "DC",
                    "id" : "7"
            }


     ]  // I want to remove this 

Согласно блогу Microsoft мы можем использовать

ДЛЯ ПУТИ JSON, БЕЗ_ARRAY_WRAPPER

но если я использую это, то оно не включает страну и штат как отдельные дочерние объекты поэтому я использовал «FOR JSON AUTO», который дает мне желаемый результат, но он дополнительно добавляет квадратные скобки к каждому объекту json

Это мой запрос

 Select ord.*, (Select *  from Address ad Left outer join Country country on country.Id = ad.CountryId
 Left outer join State sp on sp.Id = ad.StateId  where ad.Id = ord.AddressId  FOR JSON AUTO) as AddressJson
 , (Select *  from Address ad Left outer join Country country on country.Id = ad.CountryId
 Left outer join State sp on sp.Id = ad.StateId  where ad.Id = ord.AddressId1  FOR JSON AUTO, WITHOUT_ARRAY_WRAPPER) as AddressJson2
 from [order] ord ) 

1 Ответ

1 голос
/ 09 июля 2019

Я не вижу необходимости использовать все подзапросы в вашем примере.Я бы просто использовал соединения и псевдонимы, разделенные точками, чтобы получить желаемый результат.

Форматировать результаты запроса как JSON с FOR JSON

в режиме PATHВы можете использовать точечный синтаксис - например, Item.UnitPrice - для форматирования вложенного вывода.

Затем добавьте параметр WITHOUT_ARRAY_WRAPPER, чтобы удалить скобки.

Вот рабочийпример:

DECLARE @AddressTable TABLE
    (
        [Id] INT
      , [countryId] INT
      , [stateId] INT
      , [FirstName] NVARCHAR(100)
      , [LastName] NVARCHAR(100)
    );

DECLARE @countryTable TABLE
    (
        [Id] INT
      , [name] NVARCHAR(100)
    );

DECLARE @stateTable TABLE
    (
        [Id] INT
      , [name] NVARCHAR(100)
    );

INSERT INTO @AddressTable (
                              [Id]
                            , [countryId]
                            , [stateId]
                            , [FirstName]
                            , [LastName]
                          )
VALUES ( 1, 5, 7, N'John', N'cena' );

INSERT INTO @countryTable (
                              [Id]
                            , [name]
                          )
VALUES ( 5, N'usa' );

INSERT INTO @stateTable (
                            [Id]
                          , [name]
                        )
VALUES ( 7, N'DC' );

SELECT     [a].[FirstName]
         , [a].[LastName]
         , [ct].[name] AS 'Country.name' --dot-separated alias
         , [ct].[Id] AS 'Country.Id'
         , [st].[name] AS 'States.name'
         , [st].[Id] AS 'States.Id'
FROM       @AddressTable [a]
INNER JOIN @stateTable [st]
    ON [st].[Id] = [a].[stateId]
INNER JOIN @countryTable [ct]
    ON [ct].[Id] = [a].[countryId]
FOR JSON PATH, WITHOUT_ARRAY_WRAPPER;

, который дает следующий вывод:

{
  "FirstName": "John",
  "LastName": "cena",
  "Country": {
    "name": "usa",
    "Id": 5
  },
  "States": {
    "name": "DC",
    "Id": 7
  }
}
...