Чтобы создать вложенный 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"
}
]
}
Если вам нужно более чистое решение, вы должны написать два представления:
- Первое представление с «корневыми» элементами:
- ItemCode
- ItemName
- CodeBars
- WhsCode
- второе представление с дочерними элементами:
- 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