sql - 为 1 列中的用户返回多个角色而不是多行
问题描述
SQL 服务器
我正在尝试为包含他们的名字、姓氏、电子邮件等的用户返回 1 行,以及包含在通过 UserRoles 连接的单独角色表中的所有角色。
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
返回
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 个角色的用户,这会返回正确的信息,它会返回 2 个单独的行。我的目标是在包含两个角色值的角色列中返回 1 行,其中包含逗号分隔值。这可能吗?
谢谢!
解决方案
您可以尝试使用JOIN
子句和STRING_AGG
方法。在这里您可以找到此方法的文档。您的查询结果如下:
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
在这里你可以找到一些东西)
推荐阅读
- python - 如何从网络摄像头opencv python流式传输
- java - Java toString()如何返回String消息代替null
- javascript - Json 向左或向右合并打字稿
- html - 两条线之间的垂直对齐
- java - RxJava - 如何使用两个可观察对象重复 takeUntil 操作,一个可观察对象取决于另一个
- sql - 使用模式时,Postgresql ILIKE/LIKE ANY 不返回任何结果
- java - Java:将每个字母转换为数字,例如 a = 1、b = 2、c = 3
- java - 使用 Thread 和 Runnable 时,Lamba 在 Java 中如何工作?
- javascript - 从数组 MongoDB 中删除对象
- multidimensional-array - 复制到另一个可分配数组后,Fortran 90 不保留数组下限/上限