【问题标题】:How to avoid nested keys and values while joining tables and using 'for json auto'如何在加入表和使用“for json auto”时避免嵌套键和值
【发布时间】:2025-12-17 20:55:01
【问题描述】:

我正在尝试从 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 

返回这个:

[{"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"}] }]

【问题讨论】:

    标签: sql json sql-server sql-server-2017


    【解决方案1】:

    您需要使用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"}}]
    

    【讨论】:

      【解决方案2】:

      最简单的方法

      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 
      

      【讨论】: