将表中的行连接并连接成字符串

时间:2019-06-05 04:49:59

标签: postgresql

我有2个表考虑将表命名为fp和batch,我必须基于第1个表的fp [主键]和第2个表的fp_inst_id联接2个表,这样我的输出是:

第一张表的所有列和第二张表的一列,它们是表1和表2的连接在fp.id和batch.fp_inst_id上的所有行的连接字符串。 注意 : [表2的唯一ID将有多个fp_inst_id(表2)]

让我给你一个例子:

创建的表:

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;

simple join operation

我想要的是:

Output expected

批处理列可以有所不同,就像没关系,如果它还有一些不由[]包围并在';'上分隔的分隔符等等。

我尝试过的事情:

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

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

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

我正在尝试通过查询在POSTGRES SQL中做到这一点。

非常感谢您的帮助

2 个答案:

答案 0 :(得分:1)

使用array_agg组合批处理行,并使用分组依据将组合括起来。

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)"}

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

答案 1 :(得分:1)

或者,您可以使用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"}