【问题标题】:Comma separated values with all rows from a table表中所有行的逗号分隔值
【发布时间】:2017-02-13 06:29:01
【问题描述】:

我有一个包含三列的 Services 表。

服务

sr_id lang alias
1     EN    A
1     PA    B
1     HI    C
2     EN    D
2     HI    E

现在,我想输出每个服务 ID,语言和别名列将是服务别名的串联。

样本输出 -

SR_ID   lang   alias
1       EN     A,B,C
1       PA     A,B,C
1       HI     A,B,C
2       EN     D,E
2       HI     D,E

如何使用 PostgreSQL 9.4 做到这一点?

【问题讨论】:

    标签: sql postgresql postgresql-9.4 string-aggregation


    【解决方案1】:

    如果你不需要它们排序,你可以使用:

    select sr_id, lang, string_agg(alias, ',') over () as alias
    from services
    order by sr_id;
    

    否则你需要:

    select s.sr_id, s.lang, t.alias
    from services s
    join (
       select sr_id, string_agg(alias, ',' order by alias) as alias
       from services 
       group by sr_id
    ) t on t.sr_id = s.sr_id
    order by s.sr_id;
    

    【讨论】:

    • 您可以将内部子查询放入 CTE 以提高可读性/性能,但无论如何都要 +1
    • @TimBiegeleisen:将 group by query 放入 CTE 不会对性能产生任何影响
    【解决方案2】:

    尝试使用相同的样本数据创建类似的条件。请检查以下查询

    select a.sr_id , a.lang, b.ALIAS from 
    SERVICES a  , 
    (
    select sr_id , string_agg(ALIAS::text,',') ALIAS
    from SERVICES
    group by sr_id) b
    where a.sr_id = b.sr_id;
    

    【讨论】:

    • 最好使用显式 JOIN 而不是老式(1992 年以前的老式)隐式连接:…FROM Services A JOIN (SELECT … ) B ON A.Sr_ID = B.Sr_ID…
    • 感谢您的建议。会照顾的。
    猜你喜欢
    • 2012-04-11
    • 1970-01-01
    • 1970-01-01
    • 2017-09-13
    • 1970-01-01
    • 2017-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多