【问题标题】:Join and Concatenate rows from table into into string将表中的行连接并连接到字符串中
【发布时间】:2019-06-05 04:49:59
【问题描述】:

我有 2 个表考虑名为 fp 和批处理的表,我必须根据第一个表的 fp[主键] 和第二个表的 fp_inst_id 连接 2 个表,这样我的输出是:

第一个表的所有列和第二个表的一列是 fp.id 和 batch.fp_inst_id 上表 1 和表 2 连接的所有行的连接字符串。 笔记 : [将有多个 fp_inst_id(of table 2) 用于唯一 ID(of table 1)]

让我举个例子:

创建的表:

CREATE TABLE fp (
    PersonID int,
    LastName varchar(255),
    FirstName varchar(255),
    Address varchar(255),
    City varchar(255) 
);

CREATE TABLE batch (
    batchID int,
    fp_inst_id int,
    xyz varchar(255),
    abc varchar(255) 
);

insert into fp values(1,'savan','nahar','abc','xyz');
insert into fp values(2,'mmm','asmd','aawd','12k3mn');

insert into batch values(1,1,'garbage1', 'abc1');
insert into batch values(2,1,'garbage2', 'abc2');
insert into batch values(3,1,'garbage3', 'abc3');
insert into batch values(4,2,'garbage9', 'abc9');

如果我像这样正常加入:

select * from fp join batch on fp.PersonID = batch.fp_inst_id;

我想要的是:

批处理列可以不同,如果它有一些其他不被 [] 包围并在 ';' 上分隔的分隔符,那就没问题了什么的。

我尝试过的:

使用 MYSQL 使用 STUFF,FOR XML PATH 也可以完成同样的事情

但在 POSTGRES SQL 中似乎很困难,因为它不支持这些东西, 在 POSTGRES SQL 中,我尝试了 string_agg,但它说我要按所有内容分组

我尝试的第二件事是: 使用 with 子句首先在 fp_inst_id 上创建表 2 group by 的连接字符串,但在 POSTGRES SQL 中,它允许在主键上进行 group by(这是正常的选择)或者它要求使用聚合函数

我正在尝试通过查询在 POSTGRES SQL 中执行此操作。

提前感谢您的帮助

【问题讨论】:

    标签: postgresql


    【解决方案1】:

    使用array_agg 组合批处理行并使用group-by 将组合括起来。

    select personid,lastname,firstname,address,city,
         array_agg(batch) 
    from fp 
    join batch on fp.PersonID = batch.fp_inst_id 
    group by personid,lastname,firstname,address,city;
    

    例如:

    jasen=# select personid,lastname,firstname,address,city,array_agg(batch) from fp join batch on fp.PersonID = batch.fp_inst_id group by 1,2,3,4,5;
    
     personid | lastname | firstname | address |  city  |                              array_agg                              
    ----------+----------+-----------+---------+--------+---------------------------------------------------------------------
            2 | mmm      | asmd      | aawd    | 12k3mn | {"(4,2,garbage9,abc9)"}
            1 | savan    | nahar     | abc     | xyz    | {"(1,1,garbage1,abc1)","(2,1,garbage2,abc2)","(3,1,garbage3,abc3)"}
    

    这里的批处理列在技术上包含一个元组数组,但字符串表示似乎可以接受。

    【讨论】:

    • 谢谢,它起作用了,我了解了 array_agg,在 API 中使用 array_agg 时会引起一些问题,所以我只是转换成 string_agg !非常感谢
    【解决方案2】:

    或者,您可以使用concat_ws() 连接值,然后分组

    select personid,lastname,firstname, address,city, array_agg(batch_columns) as batch_columns 
    from 
    (select fp.*, concat_ws(' / ',batch.batchid,batch.fp_inst_id, batch.xyz,batch.abc)::text as batch_columns 
    from fp 
    join batch 
    on fp.personid=batch.fp_inst_id)as table1
    group by 1,2,3,4,5;
    
    
    personid  | lastname | firstname | address |  city  |                                  batch_columns                                  
    ----------+----------+-----------+---------+--------+---------------------------------------------------------------------------------
            1 | savan    | nahar     | abc     | xyz    | {"1 / 1 / garbage1 / abc1","2 / 1 / garbage2 / abc2","3 / 1 / garbage3 / abc3"}
            2 | mmm      | asmd      | aawd    | 12k3mn | {"4 / 2 / garbage9 / abc9"}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-31
      • 2010-10-30
      • 1970-01-01
      • 2021-08-07
      • 1970-01-01
      • 2021-10-25
      • 1970-01-01
      相关资源
      最近更新 更多