2015-06-23 20 views
5

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 
+0

Penso che si possa trovare questo utile: http://stackoverflow.com/questions/3994556/eliminate-duplicate-array-values-in-postgres –

+0

Perché vuoi farlo senza una sotto-query ? – Patrick

+0

@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 –

risposta

3

molto semplicemente, non aggregare i team_name ma 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

Non ci ho pensato in realtà , bel suggerimento ... ma il fatto è che ci sono più tabelle da unire e più colonne selezionate –

+0

Anche io mi aspetto una funzione/implementazione generica che possa essere usata anche in altre query .. –

+2

Quanto sopra risponde esattamente alla tua domanda, tu puoi controllare nel tuo SQLFiddle. Certo, non posso rispondere a cose che non hai chiesto. Quindi modifica la tua domanda o pubblica una nuova domanda. Cosa intendi per "funzione/implementazione generica", ad esempio? – Patrick

1

era in realtà un mis prendi dalla mia parte ... la risposta alla mia prima domanda si trova in quella query stessa. Devo solo racchiudere lo (array_agg(team_name))[1], prima l'ho provato senza le parentesi.

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 
Problemi correlati