T SQL: снятие квадратных скобок с JSON дочернего объекта - PullRequest
0 голосов
/ 28 апреля 2020

У меня есть следующий SQL запрос для создания JSON. Я использую WITHOUT_ARRAY_WRAPPER, поэтому root не создает массив.

select *
from Documents D
join Notices Notice ON Notice.DocumentID = D.DocumentID
join NoticeDetails NoticeDetail on NoticeDetail.DocumentID = d.DocumentID
where d.DocumentID = 1234
FOR JSON Auto,WITHOUT_ARRAY_WRAPPER,INCLUDE_NULL_VALUES

Приведенный выше запрос выдает следующее JSON. (Для краткости я удалил некоторые json свойства)

{
    "DocumentID": 1234,
    "ClientID": 3,  
    "Notice": [
        {
            "DocumentID": 1234,
            "StateCode": null,          
            "NoticeDetail": [
                {
                    "NoticeDetailID": 80122,
                    "DocumentID": 1234,                             
                    "CreatedDateTime": "2020-03-26T16:08:40.730",
                    "ModifiedDateTime": "2020-03-26T16:08:40.730"               
                }
            ]
        }
    ]
}

DocumentID - это PK в таблице Documents и FK в таблице Notices и NoticeDetails. Также его УНИКАЛЬНЫЙ КЛЮЧ в таблице Notices.
Так что в основном от Documents до Notices это отношение 1 к 1. Поэтому я не хочу, чтобы Notice свойство было массивом в выводе json.

Мой ожидаемый результат json должен быть

{
    "DocumentID": 1234,
    "ClientID": 3,  
    "Notice": 
        {
            "DocumentID": 1234,
            "StateCode": null,          
            "NoticeDetail": [
                {
                    "NoticeDetailID": 80122,
                    "DocumentID": 1234,                                         
                    "CreatedDateTime": "2020-03-26T16:08:40.730",
                    "ModifiedDateTime": "2020-03-26T16:08:40.730"               
                }
            ]
        }       
}

Каким должен быть мой SQL, чтобы получить ожидаемый результат?

1 Ответ

0 голосов
/ 28 апреля 2020

Я думаю, что нашел это. На основе ТАК ПОЧТА здесь

select *,
JSON_QUERY((
    SELECT *
    ,JSON_QUERY((
        SELECT * FROM NoticeDetails NoticeDetail
        WHERE NoticeDetail.DocumentID = D.DocumentID
        FOR JSON PATH
    )) AS NoticeDetail
    FROM Notices Notice
    WHERE Notice.DocumentID = d.DocumentID
    FOR JSON PATH,WITHOUT_ARRAY_WRAPPER
)) AS NOTICE
from Documents D
where d.DocumentID = 1234
FOR JSON PATH,WITHOUT_ARRAY_WRAPPER,INCLUDE_NULL_VALUES
...