Sql server Select for JSON with LEFT JOIN在右表中没有数据时返回单元素数组

Sql server Select for JSON with LEFT JOIN在右表中没有数据时返回单元素数组,sql-server,json,Sql Server,Json,我正在将MS SQL server数据库中的一些数据导出为JSON 从表a到表B,有两个表具有一个外键。这是一个0-many关系,即表a中的记录可能在表B中有一些数据,但不一定要有。表A包含人员记录,表B是他们当前和以前的地址列表 我使用以下语句获取JSON数据: SELECT A.Firstname, A.LastName, HistoricAddresses.AddressLine1 HistoricAddresses.AddressLine2 FROM

我正在将MS SQL server数据库中的一些数据导出为JSON

从表a到表B,有两个表具有一个外键。这是一个0-many关系,即表a中的记录可能在表B中有一些数据,但不一定要有。表A包含人员记录,表B是他们当前和以前的地址列表

我使用以下语句获取JSON数据:

SELECT
    A.Firstname,
    A.LastName,
    HistoricAddresses.AddressLine1
    HistoricAddresses.AddressLine2
FROM
    People A
LEFT JOIN
    HistoricAddresses ON HistoricAddresses.PeopleId = A.Id
FOR JSON AUTO
这将导致JSON结构如下所示:

[
    {
        "Firstname": "xyz",
        "Lastname": "xyz",
        "HistoricAddresses": [
            {
                "AddressLine1": "abc",
                "AddressLine2": "abc"
            },
            // more historic address records follow
        ]
    },
    // more records follow
]
[
    {
        "Firstname": "xyz",
        "Lastname": "xyz",
        "HistoricAddresses": [
            {}
        ]
    },
    // more records follow
]
在A表中的一条记录没有B表中的任何记录之前,这一切都是好的。在这种情况下,JSON如下所示:

[
    {
        "Firstname": "xyz",
        "Lastname": "xyz",
        "HistoricAddresses": [
            {
                "AddressLine1": "abc",
                "AddressLine2": "abc"
            },
            // more historic address records follow
        ]
    },
    // more records follow
]
[
    {
        "Firstname": "xyz",
        "Lastname": "xyz",
        "HistoricAddresses": [
            {}
        ]
    },
    // more records follow
]
HistoricadAddresses属性的内容是一个包含单个空元素的数组。它应该只是一个空数组


有没有办法做到这一点?

我想你可以用替换法

SELECT REPLACE((
SELECT
    A.Firstname,
    A.LastName,
    HistoricAddresses.AddressLine1
    HistoricAddresses.AddressLine2
FROM
    People A
LEFT JOIN
    HistoricAddresses ON HistoricAddresses.PeopleId = A.Id
FOR JSON AUTO),'{}','')

这应该可以解决问题。

我解决这个问题的方法不是使用左连接,而是使用子选择

而不是

SELECT
    A.Firstname,
    A.LastName,
    HistoricAddresses.AddressLine1
    HistoricAddresses.AddressLine2
FROM
    People A
LEFT JOIN
    HistoricAddresses ON HistoricAddresses.PeopleId = A.Id
FOR JSON AUTO
我现在正在使用

SELECT
    A.Firstname,
    A.LastName,
    (SELECT 
        HistoricAddress.AddressLine1,
        HistoricAddress.AddressLine2
     FROM
        HistoricAddress
     WHERE
        HistoricAddress.PeopleId = A.Id
     FOR JSON AUTO) AS HistoricAddresses
FROM
    People A
FOR JSON AUTO
如果没有HistoricadAddresses JSON属性,那么这将完全忽略该属性。我的解析器可以处理这个问题


不过,我还没有对它进行基准测试,所以其他解决方案肯定是受欢迎的。

你能提供模式和示例数据吗?替换可能会起到作用,json字符串可能会变得相当大,而且它更像是一个蛮力解决方案,而不是正确的SQL语句。你找到其他解决方案了吗?这似乎有点粗糙。我也有同样的问题,当我在我的C对象中反序列化时,我得到的数组似乎有一行,但它们的值都是空的。真烦人。不,对不起。我没有。我同意上面的解决方案。它非常快。我当前的用例是表A中约10万条记录,是表B中的5-6倍。压缩并将结果JSON写入文件所需的时间比查询时间长。