【问题标题】:string_agg () is not working for Postgres sql when joining on multiple tables连接多个表时,string_agg () 不适用于 Postgres sql
【发布时间】:2022-11-15 05:30:30
【问题描述】:

我必须从 user_profile 表中加入 user_name,作为 first_name 和 last_names。 uptil 这里一切都很好,当我尝试从 user_role 表中获取分配的各个角色时,它会为单个用户提供多行,因为 1 个用户可以拥有多个角色。

在尝试在 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

【问题讨论】:

    标签: postgresql join string-agg


    【解决方案1】:

    您必须使用GROUP BY 子句才能在一个组中将多个记录聚合在一起。这与不必要的(我相信)嵌套 SQL 一起导致您得到错误的结果。

    而是考虑以下内容:

    SELECT users.user_name, user_profiles.first_name, user_profiles.last_name,
        string_agg (roles.name, ',') as name
    FROM users 
      JOIN user_profiles 
        ON users.id = user_profiles.user_id
      JOIN user_roles
        ON user_roles.user_id = users.id
      JOIN roles ON user_roles.role_id = roles.id
    GROUP BY users.user_name, user_profiles.first_name, user_profiles.last_name
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-05
      • 2015-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-19
      相关资源
      最近更新 更多