【问题标题】:postgresql how to join multiple tables to get comma separated outputpostgresql如何连接多个表以获得逗号分隔的输出
【发布时间】:2016-04-02 17:00:22
【问题描述】:

我有以下表格:

  • table1 id、user_id、first_name、last_name
  • table2 id、user_id、company_name、first_name、last_name、partner_id
  • table3 商家 ID,商家名称

我想创建将返回数据行的查询: user_id, (first_name last_name), (business_name, business_name ...) 当用户与多个业务相关联时,如下所示: 123,John Doe,Business1,Business2

当我使用以下查询时,我可以得到一些重复的行:

SELECT table1.first_name, table1.last_name, table2.copmany_name,
       (case when concat(table1.first_name, table1.last_name) = '' then table2.company_name else concat_ws(' ', table1.first_name,table1.last_name) end) as name,
       table3.name as business_name
FROM table1
JOIN table2 ON table1.user_id = table2.user_id
JOIN table3 ON table2.partner_id = table3.id

这是该查询的示例:

123, John Doe, Business1
123, John Doe, Business2
125, Marie Bird, Business3

我想得到:

123, John Doe, Business1, Business2
125, Marie Bird, Business3

这可能吗?

谢谢

【问题讨论】:

  • 到文件还是只到查询结果?如果是前者,请查看stackoverflow.com/questions/1517635/…。如果是后者,请查找连接运算符||
  • 只是为了得到查询结果。我的问题是如何连接与相同 user_id 相关的 2 行或更多行
  • 啊,我现在明白了...我没有很好地阅读您的问题。
  • 您是否需要完全按照您列出的方式查看它(作为纯 CSV),或者如果您在单行中获得多行数据,则实际输出不同在理论上是可以的,你概述的方式?

标签: sql postgresql select join


【解决方案1】:

string_agg 聚合函数允许您将表达式连接在一起:

SELECT   table1.first_name,
         table1.last_name,
         table2.copmany_name,
         (CASE WHEN CONCAT(table1.first_name, table1.last_name) = '' 
               THEN table2.company_name 
               ELSE CONCAT_WS(' ', table1.first_name, table1.last_name) 
          END) AS name,
         STRING_AGG(table3.name, ', ') AS business_name
FROM     table1
JOIN     table2 ON table1.user_id = table2.user_id
JOIN     table3 ON table2.partner_id = table3.id
GROUP BY table1.first_name,
         table1.last_name,
         table2.copmany_name,
         (CASE WHEN CONCAT(table1.first_name, table1.last_name) = '' 
               THEN table2.company_name 
               ELSE CONCAT_WS(' ', table1.first_name, table1.last_name) 
          END) AS name

【讨论】:

  • 感谢您提出使用聚合函数的想法。但是,这个特定示例无法按我需要的方式工作。第一个如果聚合基于 first_name,last_name 组合而不是 user_id,第二个,如果我添加到 select 和 group by table1.user_id 我得到的结果与我的原始查询相同
【解决方案2】:

您可以在 postgresql 中使用array_agg。聚合函数从一组输入值计算单个结果。:

SELECT table1.first_name, table1.last_name, table2.copmany_name,
       (case when concat(table1.first_name, table1.last_name) = '' then table2.company_name else concat_ws(' ', table1.first_name,table1.last_name) end) as name,
       array_agg(table3.name) as business_name
FROM table1
JOIN table2 ON table1.user_id = table2.user_id
JOIN table3 ON table2.partner_id = table3.id

【讨论】:

  • 我认为缺少组
猜你喜欢
  • 2020-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多