【问题标题】:How to convert Multiple row values to one row with comma-separated value different ID in Oracle如何在Oracle中将多行值转换为具有逗号分隔值不同ID的一行
【发布时间】:2019-10-04 07:02:53
【问题描述】:

我正在尝试使用以下查询以逗号分隔值返回数据。

select u.employeeid,
       ( select name
         from   roles r
         where  r.id = ur.role_id
       ) userrole
from   users u,
       user_role ur
where  u.id in (select DISTINCT ur.user_id
                from user_role ur)
order by u.employeeid asc;

电流输出:

EMPLOYEEID USERRROLE
---------------------
1000    ROLE_SUPER_ADMIN
1000    ONBOARDING_CHECKER
1000    ROLE_SUPER_ADMIN
1000    ROLE_APPROVER
1000    ROLE_ONBORDING

现在当我执行查询时,我希望表格如下:

EMPLOYEEID USERRROLE
--------------------
1000       ROLE_SUPER_ADMIN,ONBOARDING_CHECKER,ROLE_SUPER_ADMIN,ROLE_APPROVER,ROLE_ONBORDING

【问题讨论】:

    标签: sql oracle string-aggregation


    【解决方案1】:

    使用 LISTAGG(和 ANSI 连接,而不是传统的逗号连接和令人困惑的子查询)。你可能想要的是:

    SELECT u.employeeid,
           LISTAGG( r.name, ',' ) WITHIN GROUP ( ORDER BY r.name ) AS userrole
    FROM   users u
           INNER JOIN user_role ur
           ON ( u.id = ur.user_id )
           LEFT OUTER JOIN roles r
           ON ( r.id = ur.role_id )
    GROUP BY u.employeeid
    ORDER BY u.employeeid asc;
    

    虽然我认为你实际写的是:

    SELECT u.employeeid,
           LISTAGG( r.name, ',' ) WITHIN GROUP ( ORDER BY r.name ) AS userrole
    FROM   users u
           CROSS JOIN user_role ur
           LEFT OUTER JOIN roles r
           ON ( r.id = ur.role_id )
    WHERE  EXISTS ( SELECT 1
                    FROM   user_roles x
                    WHERE  u.id = x.user_id )
    GROUP BY u.employeeid
    ORDER BY u.employeeid asc;
    

    【讨论】:

    • 收到01489. 00000 - "result of string concatenation is too long" 错误
    • 我还想从users u table 中获得更多的列
    • @Durga VARCHAR2 数据类型(这是 LISTAGG 返回的内容)最多可以存储 4000 个字符。如果您的连接字符串比那个长,那么您将收到该错误,您的选择是:(1)将字符串截断为 4000 个字符; (2) 找到一个自定义聚合函数,将字符串连接到一个CLOB; (3) 使用 XML 连接值(但你不会有逗号分隔的字符串,你会有 XML);或 (4) 使用 CASTCOLLECT 函数返回字符串集合(数组)而不是分隔字符串。 StackOverflow 上有所有这些选项的解决方案。
    • @Durga "我想从users u 表中获得更多的列" .... edit 你的问题是minimal reproducible example,其中包括:表结构的 DDL 语句; DML 语句用于说明问题的那些表中的一些示例数据;以及您对该输入的预期输出。仅仅说“我想要更多”是没有建设性的,因为我们无法确定你想要什么“更多”。
    • @Durga 。 . .不要编辑这个问题。 MT0 已经回答了您提出的问题。如果您有问题,请将其作为新问题提出。
    【解决方案2】:

    这样就可以了:

    SELECT LISTAGG("USERRROLE", ',') WITHIN GROUP (ORDER BY "USERRROLE")
    FROM Table1 group by "EMPLOYEEID";
    

    检查小提琴:http://sqlfiddle.com/#!4/d11c6/4

    谢谢!!!!!!!

    【讨论】:

      猜你喜欢
      • 2016-11-17
      • 1970-01-01
      • 1970-01-01
      • 2017-08-08
      • 1970-01-01
      • 1970-01-01
      • 2019-09-11
      • 1970-01-01
      相关资源
      最近更新 更多