我必须从user表中连接user_name,而从user_profile表中连接first_name和last_names。在此之前一切都很好,但当我尝试从user_role表中获取分配的相应角色时,它会为单个用户提供多行,因为一个用户可以有多个角色。
当尝试对role.names应用string_agg
时(以便在单个元组中以逗号分隔显示多个角色),它在单独的行中给出每个角色。
下面是我尝试在postgresql中运行的示例查询:
SELECT users.user_name, user_profiles.first_name, user_profiles.last_name,
(
SELECT string_agg (roles.name, ',')
from roles
where roles.id in (
select user_roles.role_id where users.id = user_roles.user_id
)
) as name
FROM users
JOIN user_profiles ON users.id = user_profiles.user_id
JOIN user_roles ON user_roles.user_id = users.id
2条答案
按热度按时间mzmfm0qo1#
您必须使用
GROUP BY
子句,以便在一个组中将多个记录聚合在一起。这与不必要的(我相信)嵌套SQL一起将导致错误的结果。请考虑以下事项:
Online demo
zte4gxcn2#
您在最里面的子查询中忘记了
from
:如果没有它,子查询就只是选择一个角色,即当前行的
role_id
,而不是像您所期望的那样独立地获取用户的所有角色。请参见demo。请注意,一旦这个问题得到解决,您还需要去掉最后一个连接(在我的示例中注解掉了),以避免为每个用户的角色增加用户--反正您已经在最内层的子查询中获得了他们的角色。
使用常规的
group by
会更容易: