Посмотреть, чтобы отразить структуру этого JSON - PullRequest
0 голосов
/ 25 июня 2018

Это мой JSON:

{              
                    "ItemCode": "NEWZTN109314",
                    "ItemName": "STAFFA SGNACIO RAPIDO ANTENNA NAV900",
                    "CodeBars": "2000000100227",
                    "WhsCode": "M1"
                    "Bin":[
                    {
                        "AbsEntry": 1,
                        "BinCode": "M1-SYSTEM-BIN-LOCATION",
                        "OnHandQty": "-2"
                    },
                    {
                        "AbsEntry": 6,
                        "BinCode": "M1-F-01-A1-01",
                        "OnHandQty": "250"
                    },
                    {
                        "AbsEntry": 7,
                        "BinCode": "M1-F-01-A1-02",
                        "OnHandQty": "250"
                    }
                    ]
}

Поля объявлений в таблице:

CREATE VIEW "MyVie"( "AbsEntry",
     "BinCode",
     "ItemCode",
     "ItemName",
     "CodeBars",
     "OnHandQty",
     "WhsCode" ) AS SELECT
 "OBIN"."AbsEntry",
     "OBIN"."BinCode",
     "OIBQ"."ItemCode",
     "OITM"."ItemName",
     "OITM"."CodeBars",
     "OIBQ"."OnHandQty",
     "OIBQ"."WhsCode" 
FROM "OBIN" 
INNER JOIN "OIBQ" ON "OBIN"."AbsEntry"="OIBQ"."BinAbs" 
INNER JOIN "OITM" ON "OITM"."ItemCode"="OIBQ"."ItemCode"

Какие изменения я должен сделать, чтобы иметь возможность отражать этот паттерн?

1 Ответ

0 голосов
/ 26 июня 2018

Чтобы создать вложенный JSON, который вы опубликовали, вы должны использовать оператор JOIN (подробнее здесь ).

Чтобы использовать объединение, у вас должно быть два представления / таблицы.Решение quick & dirty состоит в том, чтобы самостоятельно присоединиться к уже имеющемуся представлению (MyVie) и затем извлечь вывод JSON с помощью FOR JSON AUTO:

select A.ItemCode, A.ItemName, A.CodeBars, A.WhsCode, 
       Bin.AbsEntry, Bin.BinCode, Bin.OnHandQty
from MyVie A 
inner join MyVie Bin on A.AbsEntry = Bin.AbsEntry 
      and A.BinCode = Bin.BinCode 
      and A.ItemCode = Bin.ItemCode
for json auto, WITHOUT_ARRAY_WRAPPER   

Вывод:

{
  "ItemCode": "NEWZTN109314",
  "ItemName": "STAFFA SGNACIO RAPIDO ANTENNA NAV900",
  "CodeBars": "2000000100227",
  "WhsCode": "M1",
  "Bin": [
    {
      "AbsEntry": 1,
      "BinCode": "M1-SYSTEM-BIN-LOCATION",
      "OnHandQty": "-2"
    },
    {
      "AbsEntry": 6,
      "BinCode": "M1-F-01-A1-01",
      "OnHandQty": "250"
    },
    {
      "AbsEntry": 7,
      "BinCode": "M1-F-01-A1-02",
      "OnHandQty": "250"
    }
  ]
}

Если вам нужно более чистое решение, вы должны написать два представления:

  1. Первое представление с «корневыми» элементами:
    • ItemCode
    • ItemName
    • CodeBars
    • WhsCode
  2. второе представление с дочерними элементами:
    • AbsEntry
    • BinCode
    • OnHandQty

, затем вы можете JOIN эти представления и извлечь JSON, как в предыдущем примере.

Вот полныйкод, который я использовал для решения quick & dirty :

if OBJECT_ID('OIBQ') is not null drop TABLE OIBQ
if OBJECT_ID('OITM') is not null drop TABLE OITM
if OBJECT_ID('OBIN') is not null drop TABLE OBIN
go
CREATE TABLE OIBQ(ItemCode varchar(50), OnHandQty varchar(50), WhsCode  varchar(50), BinAbs int)
CREATE TABLE OITM(ItemCode varchar(50), ItemName  varchar(50), CodeBars varchar(50))
CREATE TABLE OBIN(AbsEntry int        , BinCode   varchar(50), BinAbs   int)
go
insert into OIBQ values
     ('NEWZTN109314',-2,'M1',1)
    ,('NEWZTN109314',250,'M1',6)
    ,('NEWZTN109314',250,'M1',7)
insert into OITM values 
    ('NEWZTN109314','STAFFA SGNACIO RAPIDO ANTENNA NAV900','2000000100227')
insert into OBIN values
     (1, 'M1-SYSTEM-BIN-LOCATION', -2)
    ,(6, 'M1-F-01-A1-01', 250) 
    ,(7, 'M1-F-01-A1-02', 250)
go
if OBJECT_ID('MyVie') is not null
drop VIEW MyVie
go
CREATE VIEW MyVie( AbsEntry,
     BinCode,
     ItemCode,
     ItemName,
     CodeBars,
     OnHandQty,
     WhsCode ) AS SELECT
 OBIN.AbsEntry,
     OBIN.BinCode,
     OIBQ.ItemCode,
     OITM.ItemName,
     OITM.CodeBars,
     OIBQ.OnHandQty,
     OIBQ.WhsCode 
FROM OBIN 
    INNER JOIN OIBQ ON OBIN.AbsEntry=OIBQ.BinAbs 
    INNER JOIN OITM ON OITM.ItemCode=OIBQ.ItemCode
go
select A.ItemCode, A.ItemName, A.CodeBars, A.WhsCode, 
       Bin.AbsEntry, Bin.BinCode, Bin.OnHandQty
from MyVie A 
inner join MyVie Bin on A.AbsEntry = Bin.AbsEntry and A.BinCode = Bin.BinCode and A.ItemCode = Bin.ItemCode
for json auto, WITHOUT_ARRAY_WRAPPER   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...