如何在连接表和使用 '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"}}]
我正在尝试从 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"}}]