2010-08-26 12 views
5

Tengo una tabla de base de datos con los datos como se muestra a continuación:SQL consulta de selección ayuda

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 

Quiero escribir una consulta para que se capturen todos los valores distintos en la columna 1 y anexar los valores en la columna 2 para cada valor de la columna 1. Por ejemplo: La consulta debe devolver

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

**Utah Jazz  | Malone** 

**Orlando Magic | Hardaway** 

me puede escribir una consulta para recuperar todos los valores distintos en la columna 1, a continuación, iterar sobre cada valor distinto para obtener la columna anexa 2 después de una manipulación. ¿Es posible hacer todo el trabajo en una sola consulta? Por favor ayuda con un ejemplo de una consulta. Gracias.

+0

¿Qué DMBS estás usando? –

+0

De hecho, hay un conjunto bastante completo de enfoques para abordar esto en diferentes RDBMS aquí - posible duplicado de [¿Cómo puedo crear una lista separada por comas usando una consulta SQL?] (Http://stackoverflow.com/questions/1817985/how-do-i-create-a-comma-separated-list-using-a-sql-query) –

+0

estoy usando Java derby ... – Fishinastorm

Respuesta

5

Si está utilizando MySQL

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

Esto no le da al OP el resultado final que está buscando. – Dutchie432

+0

@Dutchie - ¿Por qué no? Me parece correcto. –

+0

¿Sabes qué? Leí mal tu solución. Se olvidó con más precisión del "group_concat" ... El voto a la baja cambió a la votación positiva. Mi error. – Dutchie432

2

Si está utilizando 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 
No

seguro de por qué Microsoft hace que éste tan duro, pero por lo que sé que este es el único método para hacer esto en SQL Server ...

En una nota lateral puede considerar cambiar Column1 a una tabla de búsqueda o la próxima vez que Utah se mueva va a estar odiando la vida;)

+0

+1 Creo que este es el mejor método en SQL Server que hay [otras posibilidades] (http://www.projectdmx.com/tsql/rowconcatenate.aspx) aunque no tan eficiente y no garantiza el pedido. También es posible que desee ver [aquí] (http://sqlblogcasts.com/blogs/tonyrogerson/archive/2006/07/06/871.aspx) una forma de detenerlo escapando caracteres XML especiales –

+1

Presentador: "Y jugando escolta para los Chicago Bulls tenemos > & < anteriormente conocido como Michael Jordan !!! " (La muchedumbre se vuelve loca) –

0

La solución general a este tipo de problema es la función agregada ARRAY_AGG() que devuelve una matriz que contiene los valores en filas diferentes, opcionalmente ordenados por algunos criterios. Esta función se ha propuesto para la próxima versión del estándar SQL. La función GROUP_CONCAT() es un caso especial que convierte la matriz en una cadena separada por comas.

Tanto ARRAY_AGG() como GROUP_CONCAT() son compatibles con la última HSQLDB 2.0.1. http://hsqldb.org/doc/2.0/guide/dataaccess-chapt.html#N12312

+0

De los comentarios resultó que el OP está realmente usando "java derby" –

+0

La publicación no lo mencionó. Derby no tiene esta capacidad todavía. Por lo tanto, las respuestas pueden ayudarlo a elegir una alternativa si así lo desea. – fredt

0

SQL Anywhere tiene una función list() aggregation desde hace más de diez años exactamente para este propósito.

Si está utilizando SQL Server, aparte de la solución complicada que abusa de XML en cierta medida, puede escribir su propia función de agregación en cualquier idioma .net. Y el Microsoft documentation of this feature usa exactamente el caso de la concatenación de cadenas como ejemplo.

+0

De los comentarios resultó que el OP está realmente usando "java derby" –

+0

Oh, tenía sql-server como una etiqueta cuando escribí mi respuesta. – Frank

Cuestiones relacionadas