【发布时间】:2015-06-23 08:06:13
【问题描述】:
我正在编写查询以获取所有球队的所有球员。我决定使用array_agg() 在单个查询中获取所有球队的球员,而不是在应用程序中循环。我写的查询如下:
SELECT team_id, array_agg(team_name) AS teamname,
array_agg(player_id||'##'||player_name) AS playerdetails
FROM team
INNER JOIN players ON team_id = player_team
GROUP BY team_id
这个查询给我的结果如下,在结果集中 teamname 被重复(精确到玩家的数量)
team_id team_name playerdetails
1 {Australia,Australia,Australia,Australia} {"5##Glenn Donald McGrath","6##Shane Warne","2##Steve Waugh","1##Adam Gilchrist"}
2 {India,India,India,India} {"8##Kapil Dev","11##Saurav Ganguly","3##Rahul Dravid","9##Sachin Tendulkar"}
3 {"South Africa","South Africa","South Africa","South Africa"} {"12##Gary Kristen","4##Shaun Pollock","7##Jacques Kallis","10##Alan Donald"}
有没有办法返回这样的结果
team_id team_name playerdetails
1 Australia {"5##Glenn Donald McGrath","6##Shane Warne","2##Steve Waugh","1##Adam Gilchrist"}
我已经使用子查询实现了它,但想知道是否可以在没有子查询的情况下编写它
SELECT team_id, teamname[1], playerdetails
FROM (
SELECT team_id, array_agg(team_name) AS teamname,
array_agg(player_id||'##'||player_name) AS playerdetails
FROM team
INNER JOIN players ON team_id = player_team
GROUP BY team_id) AS tempresult
sqfiddle 在这里。我正在使用 Postgresql 8.4
[编辑]
当尝试检索未在 group by 中指定的列时,我实际上是在考虑破解 GROUP BY 限制 column "team.team_status" must appear in the GROUP BY clause or be used in an aggregate function
SELECT team_id, array_agg(team_name) AS teamname,
array_agg(player_id||'##'||player_name) AS playerdetails,
team_status -- could be replaced by something like array_agg(team_status)[0] or customfunction(team_status)
FROM team
INNER JOIN players ON team_id = player_team
GROUP BY team_id
【问题讨论】:
-
我想你会发现这很有用:stackoverflow.com/questions/3994556/…
-
为什么要在没有子查询的情况下这样做?
-
@Patrick 首先,这个问题是基于一些好奇心,我尝试这样做但没有取得多大成功。我认为在考虑大型数据集上的大型复杂查询时,使用子查询效率会降低跨度>
标签: sql postgresql