首页 > 解决方案 > 将表中的行连接并连接到字符串中

问题描述

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

第一个表所有列和第二个表一列,它是 fp.id 和 batch.fp_inst_id 上表 1 和表 2 连接的所有行的连接字符串。注意:[将有多个 fp_inst_id(表 2)用于唯一 ID(表 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

解决方案


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

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


推荐阅读