2015-06-23 2 views
5

Я пишу запрос, чтобы получить всех игроков для всех команд. Вместо того, чтобы зацикливаться на приложении, я решил получить игроков всех команд в одном запросе, используя 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 
+0

Я думаю, что вы можете найти это полезным: http://stackoverflow.com/questions/3994556/eliminate-duplicate-array-values-in-postgres –

+0

Почему вы хотите сделать это без подзапроса ? – Patrick

+0

@Patrick Сначала вопрос основан на каком-то любопытстве, я пытался сделать это без особого успеха .. и я думаю, что использование подзапроса будет менее эффективным при рассмотрении больших и сложных запросов на больших наборах данных. –

ответ

3

Очень просто, не агрегировать team_name но GROUP BY это:

SELECT team_id, team_name, array_agg(player_id||'##'||player_name) AS playerdetails 
FROM team 
JOIN players ON team_id = player_team 
GROUP BY team_id, team_name; 
+0

Я не думал об этом на самом деле , хорошее предложение ... но факт, что есть больше таблиц, которые нужно объединить, и больше столбцов выбора. –

+0

Также я ожидаю, что общая функция/реализация также может использоваться и в других запросах. –

+2

Вышеуказанный ответ на ваш вопрос, вы может проверить ваш собственный SQLFiddle. Конечно, я не могу ответить на то, о чем вы не спрашивали. Поэтому, пожалуйста, отредактируйте свой вопрос или опубликуйте новый вопрос. Что вы подразумеваете под «общей функцией/реализацией», например? – Patrick

1

это было на самом деле неправильно возьмите с моей стороны ... ответ на мой первый вопрос заключается в самом запросе. Мне просто нужно приложить (array_agg(team_name))[1], ранее я пробовал его без скобок.

SELECT team_id, (array_agg(team_name))[1] AS teamname, 
    array_agg(player_id||'##'||player_name) AS playerdetails 
FROM team 
INNER JOIN players ON team_id = player_team 
GROUP BY team_id 
Смежные вопросы