Sql server Select for JSON with LEFT JOIN在右表中没有数据时返回单元素数组
我正在将MS SQL server数据库中的一些数据导出为JSON 从表a到表B,有两个表具有一个外键。这是一个0-many关系,即表a中的记录可能在表B中有一些数据,但不一定要有。表A包含人员记录,表B是他们当前和以前的地址列表 我使用以下语句获取JSON数据: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
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写入文件所需的时间比查询时间长。