Select psql 9.1在一行中合并选择结果
我有4张桌子,每个桌子都有超过10K的行:Select psql 9.1在一行中合并选择结果,select,psql,Select,Psql,我有4张桌子,每个桌子都有超过10K的行: Table "public.items" Column | Type | Modifiers ----------------+------------------+--------------- id | integer | not null default nextv
Table "public.items"
Column | Type | Modifiers
----------------+------------------+---------------
id | integer | not null default nextval
title | text | not null
Table "public.issues"
Column | Type | Modifiers
-------------+-----------------+------------------
id | integer | not null default nextval
name | text | not null
Table "public.authors"
Column | Type | Modifiers
--------------+---------------------+-----------------------
id | integer | not null default nextval
first_name | text | not null
last_name | text | not null
Table "public.item_issues"
Column | Type | Modifiers
----------+---------+-----------
item_id | integer | not null
issue_id | integer | not null
Table "public.item_authors"
Column | Type | Modifiers
-----------+---------+-----------
item_id | integer | not null
author_id | integer | not null
我想列出所有项目及其作者和问题,知道一个项目可以有多个问题和多个作者。到目前为止,我的select查询返回的是正确的信息,但有几行
查询:
select i.id, i.title, iss.id as issue_id, iss.name, a.first_name, a.last_name
join item_authors ia on (ia.item_id = i.id)
join authors a on (a.id = ia.author_id)
join issues iss on (iss.id = iis.issue_id)
join item_issues iis on (iis.item_id = i.id)
结果是:
id | title | issue_id | name | first_name | last_name
----|-------|----------|---------|------------|--------------
1 | A | 22 | elected | David | Lowes
1 | A | 54 | health | David | Lowes
2 | C | 10 | art | Adam | Dole
2 | C | 10 | art | John | Paul
3 | D | 28 | eat | Barbara | Wu
3 | D | 17 | weight | Barbara | Wu
3 | D | 54 | health | Barbara | Wu
3 | D | 28 | eat | Sam | Sara
3 | D | 17 | weight | Sam | Sara
3 | D | 54 | health | Adam | Dole
3 | D | 28 | eat | Adam | Dole
3 | D | 17 | weight | Adam | Dole
3 | D | 54 | health | Sam | Sara
但我想:
id | title | issue_id | name | first_name last_name
----|-------|------------|---------------------|--------------------------
1 | A | 22,54 | elected, health | David Lowes
2 | C | 10 | art | John Paul, Adam Dole
3 | D | 28, 17, 54 | eat, weight, health | Barbara Wu, Sam Sara, Adam Dole
一次查询是否可行?使用
array\u agg
和array\u to\u string
函数组合可以执行类似操作
select i.id, i.title,
array_to_string(array_agg(iss.id), ', ') as issue_id,
array_to_string(array_agg(iss.name), ', ') as name,
array_to_string(array_agg(a.first_name || a.last_name), ', ') as "first_name last_name"
from issues i
join item_authors ia on ia.item_id = i.id
join authors a on a.id = ia.author_id
join issues iss on iss.id = iis.issue_id
join item_issues iis on iis.item_id = i.id
group by i.id, i.title
使用
array\u agg
和array\u to\u string
函数组合,您可以执行以下操作
select i.id, i.title,
array_to_string(array_agg(iss.id), ', ') as issue_id,
array_to_string(array_agg(iss.name), ', ') as name,
array_to_string(array_agg(a.first_name || a.last_name), ', ') as "first_name last_name"
from issues i
join item_authors ia on ia.item_id = i.id
join authors a on a.id = ia.author_id
join issues iss on iss.id = iis.issue_id
join item_issues iis on iis.item_id = i.id
group by i.id, i.title
它给了我一个错误:错误:函数数组_agg(文本,未知)不存在exist@mamesaye我认为括号有问题。这里有一个简单的sqlfiddle来帮助您,感谢它正在工作。我怎样才能去掉双打(D,D):nvm,明白了。在列名之前添加distinct起了作用。这给了我一个错误:错误:函数数组_agg(text,unknown)不起作用exist@mamesaye我认为括号有问题。这里有一个简单的sqlfiddle来帮助您,感谢它正在工作。我怎样才能去掉双打(D,D):nvm,明白了。在列名之前添加distinct就可以做到这一点。