postgre如何查询有许多联系电话的客户?SQL



我有两个表、客户和联系电话。每个客户都有一个或多个联系电话,这是一对多的关系。我需要制作一个excel文档,每行都有一个客户及其联系电话。例如:

客户端名称|contact_number_1|contact_nnumber_2|。。。

我想在POSTGRESQL中实现快速。我制作excel文件的方式无关紧要。我只需要查询就可以了。

谢谢!

如果您可以解析结果并从中创建Excel文件,最灵活的解决方案是将数字聚合到一个数组中:

select c.client_id,
c.client_name,
array_agg(cn.number) as contact_numbers
from client c
join concat_number cn on cn.client_id = c.client_id
group by c.client_id, c.client_name;

另一种选择是使用string_agg(cn.number, ',')来获得逗号分隔的列表(但该数组对名称中嵌入的逗号更健壮(。

如果您确实需要在单独的列中获取数字,则需要确定列的合理上限,然后可以使用第一个查询并将数组元素提取为列:

select client_id, 
client_name, 
contact_numbers[1] as contact_number_1,
contact_numbers[2] as contact_number_2,
contact_numbers[3] as contact_number_3,  
... 
from (      
select c.client_id,
c.client_name,
array_agg(cn.number) as contact_numbers
from client c
join concat_number cn on cn.client_id = c.client_id
group by c.client_id, c.client_name
) t

如果你真的想要返回一个动态的列数,这会有点复杂,因为你必须知道返回结果的最大列数,或者你为你认为会存在的最高列数硬编码一个集合数。

如果你可以接受一列代表所有可能的联系人,那么你可以将它们聚合到一列中:

select c.clientName, STRING_AGG(COALESCE(con.contact_number,''),'|') as contact_numbers
from clients c
left join contacts con on c.clientId = con.clientId
group by c.clientName
order by c.clientName

最新更新