Я пишу запрос, чтобы получить всех игроков для всех команд. Вместо того, чтобы зацикливаться на приложении, я решил получить игроков всех команд в одном запросе, используя array_agg()
. Я написал запрос следующим образом: (. Именно на нет игроков)Возврат первого элемента в 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
[EDIT]
Я был на самом деле думает о хак на 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
Я думаю, что вы можете найти это полезным: http://stackoverflow.com/questions/3994556/eliminate-duplicate-array-values-in-postgres –
Почему вы хотите сделать это без подзапроса ? – Patrick
@Patrick Сначала вопрос основан на каком-то любопытстве, я пытался сделать это без особого успеха .. и я думаю, что использование подзапроса будет менее эффективным при рассмотрении больших и сложных запросов на больших наборах данных. –