如何在连接表和使用 'for json auto' 时避免嵌套的键和值

How to avoid nested keys and values while joining tables and using 'for json auto'

我正在尝试从 JSON 格式的连接表中检索一些数据。 目前我正在尝试这个:

select top(1) 
    a.IdUser , 
    b.UserName , 
    a.IdGroup , 
    c.Title 
from UserGroupMembers as a 
inner join users as b on a.IdUser= b.iduser 
inner join UserGroups as c on a.IdGroup = c.IdUserGroup
for json auto 

哪个returns这个:

[{"IdUser":1,"IdGroup":8,"b":[{"UserName":"User1","c":[{"Title":"Group1"}]}]}]

虽然我需要得到这个:

[{"IdUser":1,"IdGroup":8, "UserName":"User1", "Title":"Group1" }]

或至少这样:

[{"IdUser":1,"IdGroup":8,"b":[{"UserName":"User1"}] ,"c":[{"Title":"Group1"}] }]

最简单的方法

select *
from (
    select top(1) 
        a.IdUser , 
        b.UserName , 
        a.IdGroup , 
        c.Title 
    from UserGroupMembers as a 
    inner join users as b on a.IdUser= b.iduser 
    inner join UserGroups as c on a.IdGroup = c.IdUserGroup
) t
for json auto 

您需要使用 FOR JSON PATH 而不是 FOR JSON AUTO:

表格:

CREATE TABLE UserGroupMembers (
   IdUser int,
   IdGroup int
)
CREATE TABLE Users (
   IdUser int,
   UserName nvarchar(50)
)
CREATE TABLE UserGroups (
   IdUserGroup int,
   Title nvarchar(100)
)
INSERT INTO UserGroupMembers(IdUser, IdGroup) VALUES (1, 8)
INSERT INTO Users(IdUser, UserName) VALUES (1, N'User1')
INSERT INTO UserGroups(IdUserGroup, Title) VALUES (8, N'Group1')

声明:

SELECT TOP (1)
    a.IdUser , 
    b.UserName, 
    a.IdGroup, 
    c.Title 
FROM UserGroupMembers AS a 
INNER JOIN Users AS b on a.IdUser= b.IdUser 
INNER JOIN UserGroups AS c on a.IdGroup = c.IdUserGroup
FOR JSON PATH

结果:

[{"IdUser":1,"UserName":"User1","IdGroup":8,"Title":"Group1"}]

请注意,对于 FOR JSON PATH,您可以使用点分隔的列名称生成 JSON 嵌套对象。

SELECT TOP (1)
    a.IdUser , 
    b.UserName AS [b.UserName], 
    a.IdGroup, 
    c.Title AS [c.Title]
FROM UserGroupMembers AS a 
INNER JOIN Users AS b on a.IdUser= b.IdUser 
INNER JOIN UserGroups AS c on a.IdGroup = c.IdUserGroup
FOR JSON PATH

结果:

[{"IdUser":1,"b":{"UserName":"User1"},"IdGroup":8,"c":{"Title":"Group1"}}]