当右表中没有数据时,使用 LEFT JOIN 选择 JSON 返回单元素数组

Ras*_*usW 3 sql-server json

我正在将一些数据从 MS SQL Server 数据库导出为 JSON。

有两张表,从表A到表B都有外键。是0多关系,即。表 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
Run Code Online (Sandbox Code Playgroud)

这会产生如下所示的 JSON 结构:

[
    {
        "Firstname": "xyz",
        "Lastname": "xyz",
        "HistoricAddresses": [
            {
                "AddressLine1": "abc",
                "AddressLine2": "abc"
            },
            // more historic address records follow
        ]
    },
    // more records follow
]
Run Code Online (Sandbox Code Playgroud)

这一切都很好,直到 A 表中的一条记录在 B 表中没有任何记录为止。在这种情况下,JSON 如下所示:

[
    {
        "Firstname": "xyz",
        "Lastname": "xyz",
        "HistoricAddresses": [
            {}
        ]
    },
    // more records follow
]
Run Code Online (Sandbox Code Playgroud)

HistoricAddresses 属性的内容是一个具有单个空元素的数组。它应该只是一个空数组。

有办法实现吗?

Ras*_*usW 6

我通过不使用 LEFT JOIN 而是使用子选择解决了这个问题。

代替

SELECT
    A.Firstname,
    A.LastName,
    HistoricAddresses.AddressLine1
    HistoricAddresses.AddressLine2
FROM
    People A
LEFT JOIN
    HistoricAddresses ON HistoricAddresses.PeopleId = A.Id
FOR JSON AUTO
Run Code Online (Sandbox Code Playgroud)

我现在正在使用

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
Run Code Online (Sandbox Code Playgroud)

这完全忽略了 HistoricAddresses JSON 属性(如果没有)。我的解析器可以处理它。

不过,我还没有对其进行基准测试,因此绝对欢迎其他解决方案。