2010-08-26 18 views
5

Ho una tabella del database con i dati come illustrato di seguito:SQL SELECT query di aiuto

Primary key | Column1  | Column2   | col3 | col4 |col5 
--------------------------------------------------------------------- 

1   | Chicago Bulls | Michael Jordan | 6'6 | aaaa | cccc 

2   | Chicago Bulls | Scottie Pippen | 6'8 | zzzz | 345 

3   | Utah Jazz  | Malone   | 6'9 | vvvv | xcxc 

4   | Orlando Magic | Hardaway   | 6'7 | xnnn | sdsd 

Voglio scrivere una query che scaricherà tutti i valori distinti in Column1 e aggiungere i valori in Column2 per ogni valore Column1. Per esempio: La query dovrebbe restituire

**Chicago Bulls | Michael Jordan, Scottie Pippen** 

**Utah Jazz  | Malone** 

**Orlando Magic | Hardaway** 

posso scrivere una domanda per recuperare tutti i valori distinti in column1, poi iterare su ogni valore distinto per ottenere la colonna aggiunto 2 dopo qualche manipolazione. È possibile eseguire l'intero lavoro in una sola query? Si prega di aiutare con un esempio di una query. Grazie.

+0

Che tipo di DMBS stai utilizzando? –

+0

In effetti esiste un insieme abbastanza completo di approcci per affrontare questo problema in diversi RDBMS qui: possibile duplicazione di [Come creare un elenco separato da virgola usando una query SQL?] (Http://stackoverflow.com/questions/1817985/how-do-i-create-a-comma-separated-list-using-a-sql-query) –

+0

am utilizzando java derby ... – Fishinastorm

risposta

5

Se si utilizza MySQL

select Column1, group_concat(Column2) 
from t 
group by Column1  
+0

Questo non dà all'OP il risultato finale che sta cercando. – Dutchie432

+0

@Dutchie - Perché no? Sembra corretto per me. –

+0

Sai cosa? Ho letto male la tua soluzione. Mancava più accuratamente il "group_concat" ... il down-voto è cambiato in up-vote. Errore mio. – Dutchie432

2

Se si utilizza SQL Server:

SELECT Column1, 
stuff((
    SELECT ', ' + Column2 
    FROM tableName as t1 
    where t1.Column1 = t2.Column1 
    FOR XML PATH('') 
    ), 1, 2, '') 
FROM tableName as t2 
GROUP BY Column1 

Non certo perché Microsoft rende questo così difficile, ma per quanto ne so questa è l'unica metodo per farlo in SQL Server ...

In una nota a margine si potrebbe prendere in considerazione la modifica di Column1 in una tabella di ricerca o la prossima volta che Utah si muoverà si odierà la vita;)

+0

+1 Penso che questo sia il metodo migliore in SQL Server ci sono [altre possibilità] (http://www.projectdmx.com/tsql/rowconcatenate.aspx) ma non altrettanto efficienti e non garantiscono l'ordine. Inoltre potresti voler vedere [qui] (http://sqlblogcasts.com/blogs/tonyrogerson/archive/2006/07/06/871.aspx) per un modo di fermarlo dall'esclusione di caratteri speciali XML –

+1

Annunciatore: "E giocare guardia di tiro per i Chicago Bulls abbiamo > & < precedentemente noto come Michael Jordan !!! " (la folla si scatena) –

0

La soluzione generale a questo tipo di problema è la funzione di aggregazione ARRAY_AGG() che restituisce una matrice contenente i valori in righe diverse, facoltativamente ordinata da alcuni criteri. Questa funzione è stata proposta per la prossima versione dello standard SQL. La funzione GROUP_CONCAT() è un caso speciale che converte l'array in una stringa separata da virgole.

Sia ARRAY_AGG() che GROUP_CONCAT() sono supportati dall'ultimo HSQLDB 2.0.1. http://hsqldb.org/doc/2.0/guide/dataaccess-chapt.html#N12312

+0

Dai commenti si è scoperto che l'OP sta effettivamente utilizzando "java derby" –

+0

Il post non l'ha menzionato. Derby non ha ancora questa capacità. Pertanto le risposte possono aiutarlo a scegliere un'alternativa se lo desidera. – fredt

0

SQL Anywhere ha una funzione list() aggregation da più di dieci anni esattamente per questo scopo.

Se si utilizza SQL Server, oltre alla soluzione complessa che abusa di XML in una certa misura, è possibile scrivere la propria funzione di aggregazione in qualsiasi lingua .net. E lo Microsoft documentation of this feature usa esattamente il caso della concatenazione di stringhe come esempio.

+0

Dai commenti si è scoperto che l'OP sta effettivamente utilizzando "java derby" –

+0

Oh, aveva sql-server come tag quando ho scritto la mia risposta. – Frank