Return 1 列而非多行中用户的多个角色

Return multiple roles for user in 1 column not multiple rows

SQL 服务器

我正在尝试 return 1 行的用户包含他们的名字、姓氏、电子邮件等,并且他们的所有角色都包含在通过 UserRoles 连接的单独角色 table 中。

User              ->     UserRoles         ->    Role
-------------            ---------------         ------------
Email                    UserEmail               Id
Firstname                RoleId                  Name
Lastname
Phone
IsActive

  declare @Email nvarchar(100);
  set @Email = 'testemail@gmail.com'
  
  SELECT [User].Email, Password, Username, Firstname, Lastname, Phone, IsActive, EmailVerified, IsBanned, BanStart, BanEnd, [Role].Name as Roles
  FROM dbo.[User], [UserRole], [Role] 
  WHERE [User].Email = @Email AND UserRole.UserEmail = [User].Email AND UserRole.RoleId = Role.Id

Return

Email               Username            Firstname Lastname Phone IsActive EmailVerified IsBanned BanStart BanEnd Roles     
testemail@gmail.com testemail@gmail.com daniel  brownn  3199999999  1   0   0   NULL    NULL    Expert
testemail@gmail.com testemail@gmail.com daniel  brownn  3199999999  1   0   0   NULL    NULL    User

不幸的是,对于具有 2 个角色的用户来说,此 return 是正确的信息,它 return 是 2 个单独的行。我的目标是在包含两个角色值的角色列中有 1 行 returned 用逗号分隔值。这可能吗?

谢谢!

您可以尝试使用JOIN子句和STRING_AGG方法。 Here 您可以找到此方法的文档。 您的查询结果如下:

SELECT
  [User].Email,
  Password,
  Username,
  Firstname,
  Lastname,
  Phone,
  IsActive,
  EmailVerified,
  IsBanned,
  BanStart,
  BanEnd,
  STRING_AGG([Role].Name, ', ') as Roles
FROM
  dbo.[User]
  JOIN [UserRole] ON [UserRole].UserEmail = [User].Email
  LEFT JOIN [Role] ON [Role].Id = [UserRole].RoleId
GROUP BY
  [User].Email,
  Password,
  Username,
  Firstname,
  Lastname,
  Phone,
  IsActive,
  EmailVerified,
  IsBanned,
  BanStart,
  BanEnd

注意 STRING_AGG 是一个 t-sql 方法,但是 MySQL 中有一些等效的东西(如果我没记错的话是 GOUP_CONCAT here你可以找到一些东西)