0

我有以下 SQL 查询来创建 JSON。我使用WITHOUT_ARRAY_WRAPPER所以根不会创建数组。

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和表中的DocumentsFK 。也是它在表中的唯一键。 所以基本上to是1对1的关系。所以我不希望属性成为输出 json 中的数组。 NoticesNoticeDetailsNotices
DocumentsNoticesNotice

我预期的输出 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 应该是什么才能获得预期的输出?

4

1 回答 1

0

我想我找到了。基于这里的 SO POST

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
于 2020-04-28T20:30:32.557 回答