我有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;
我想要的是:
批处理列可以有所不同,就像没关系,如果它还有一些不由[]包围并在';'上分隔的分隔符等等。
我尝试过的事情:
使用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中做到这一点。
非常感谢您的帮助
答案 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"}