【问题标题】:Getting data from junction table as a list of values for unique records从联结表中获取数据作为唯一记录的值列表
【发布时间】:2018-06-08 21:55:45
【问题描述】:

我有两个通过联结表以多对多关系连接的表:

    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
)

我想构建一个查询,该查询将为我提供来自用户表的结果名称和确定名称以及给定用户具有权限的房间列表。例如:

name surname rooms
Jon  Doe     [134,143,132]

我设法为 Jon Doe 每个房间获得了一些结果,但我无法折叠此结果以记录每个用户。

【问题讨论】:

    标签: sql sql-server-express junction-table


    【解决方案1】:

    在 2017 年之前的 SQL Server 中,这可以通过关联子查询 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],因为可能有多个同名用户。)

    【讨论】:

      猜你喜欢
      • 2013-05-06
      • 1970-01-01
      • 1970-01-01
      • 2011-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多