Sto scrivendo una query per ottenere tutti i giocatori per tutte le squadre. Invece di eseguire il ciclo dell'applicazione, ho deciso di riunire i giocatori di tutti i team in una singola query utilizzando array_agg()
. Ho scritto la query come segue: (. Esattamente al no di giocatori)Restituisce il primo elemento in 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
Questa interrogazione mi dà il risultato come sotto, nel risultato impostare la teamname
si ripete
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"}
Is c'è un modo per restituire il risultato come questo
team_id team_name playerdetails
1 Australia {"5##Glenn Donald McGrath","6##Shane Warne","2##Steve Waugh","1##Adam Gilchrist"}
ho raggiunto utilizzando una subquery, ma voglio sapere se la sua possibilità di scrivere senza la sottoquery
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
Il sqfiddle è qui. E io sto usando PostgreSQL 8.4
[EDIT]
realtà stavo pensando di hack al GROUP BY
limitazione column "team.team_status" must appear in the GROUP BY clause or be used in an aggregate function
quando tenta di recuperare l'una colonna che non è stata stata specificata nel gruppo da
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
Penso che si possa trovare questo utile: http://stackoverflow.com/questions/3994556/eliminate-duplicate-array-values-in-postgres –
Perché vuoi farlo senza una sotto-query ? – Patrick
@Patrick Innanzitutto la domanda si basa su qualche curiosità, ho provato a farlo senza molto successo .. e penso che l'utilizzo della sottoquery sarà meno efficiente quando si considerano query complesse e di grandi dimensioni su dataset di grandi dimensioni –