从联结点 table 获取数据作为唯一记录的值列表
Getting data from junction table as a list of values for unique records
我有两个 table 通过结点 table:
以多对多关系连接
CREATE TABLE [dbo].[User](
[ID] [int] IDENTITY(1,1) NOT NULL,
[name] [nvarchar](50) NOT NULL,
[surname] [nvarchar](50) NOT NULL,
)
CREATE TABLE [dbo].[Room](
[ID] [int] IDENTITY(1,1) NOT NULL,
[number] [nvarchar](50) NOT NULL
)
CREATE TABLE [dbo].[Permission](
[ID] [int] IDENTITY(1,1) NOT NULL,
[user_id] [int] NOT NULL,
[room_id] [int] NOT NULL
)
我想构建一个查询,该查询会为我提供来自用户 table 的结果名称和确定名称以及给定用户具有权限的房间列表。例如:
name surname rooms
Jon Doe [134,143,132]
我设法为一个房间获得了 Jon Doe 的一些结果,但我无法将其折叠起来以记录每个用户。
在 2017 年之前的 SQL 服务器中,这可以通过相关子查询 FOR XML
.
完成
SELECT [User].[name],
[User].[surname],
stuff((SELECT ',' + [Room].[number] [text()]
FROM [dbo].[Room]
INNER JOIN [dbo].[Permission]
ON [Permission].[room_id] = [Room].[ID]
WHERE [Permission].[user_id] = [User].[ID]
FOR XML PATH('')), 1, 1, NULL) [rooms]
FROM [dbo].[User];
自 2017 年以来,有了 string_agg()
聚合函数,可以将组中的字符串连接起来。
SELECT [User].[name],
[User].[surname],
string_agg([Room].[number], ',') [rooms]
FROM [dbo].[User]
INNER JOIN [dbo].[Permission]
ON [Permission].[user_id] = [User].[ID]
INNER JOIN [dbo].[Room]
ON [Room].[ID] = [Permission].[room_id]
GROUP BY [User].[ID],
[User].[name],
[User].[surname];
(注意:我确实在 GROUP BY
中添加了 [User].[ID]
,因为可能有不止一个用户同名。)
我有两个 table 通过结点 table:
以多对多关系连接 CREATE TABLE [dbo].[User](
[ID] [int] IDENTITY(1,1) NOT NULL,
[name] [nvarchar](50) NOT NULL,
[surname] [nvarchar](50) NOT NULL,
)
CREATE TABLE [dbo].[Room](
[ID] [int] IDENTITY(1,1) NOT NULL,
[number] [nvarchar](50) NOT NULL
)
CREATE TABLE [dbo].[Permission](
[ID] [int] IDENTITY(1,1) NOT NULL,
[user_id] [int] NOT NULL,
[room_id] [int] NOT NULL
)
我想构建一个查询,该查询会为我提供来自用户 table 的结果名称和确定名称以及给定用户具有权限的房间列表。例如:
name surname rooms
Jon Doe [134,143,132]
我设法为一个房间获得了 Jon Doe 的一些结果,但我无法将其折叠起来以记录每个用户。
在 2017 年之前的 SQL 服务器中,这可以通过相关子查询 FOR XML
.
SELECT [User].[name],
[User].[surname],
stuff((SELECT ',' + [Room].[number] [text()]
FROM [dbo].[Room]
INNER JOIN [dbo].[Permission]
ON [Permission].[room_id] = [Room].[ID]
WHERE [Permission].[user_id] = [User].[ID]
FOR XML PATH('')), 1, 1, NULL) [rooms]
FROM [dbo].[User];
自 2017 年以来,有了 string_agg()
聚合函数,可以将组中的字符串连接起来。
SELECT [User].[name],
[User].[surname],
string_agg([Room].[number], ',') [rooms]
FROM [dbo].[User]
INNER JOIN [dbo].[Permission]
ON [Permission].[user_id] = [User].[ID]
INNER JOIN [dbo].[Room]
ON [Room].[ID] = [Permission].[room_id]
GROUP BY [User].[ID],
[User].[name],
[User].[surname];
(注意:我确实在 GROUP BY
中添加了 [User].[ID]
,因为可能有不止一个用户同名。)