¿Cómo creo una lista separada por comas mediante una consulta SQL?

Resuelto leora asked hace 15 años • 11 respuestas

Tengo 3 tablas llamadas:

  • Aplicaciones (id, nombre)
  • Recursos (id, nombre)
  • AplicacionesRecursos (id, app_id, Resource_id)

Quiero mostrar en una GUI una tabla de todos los nombres de recursos. En una celda de cada fila, me gustaría enumerar todas las aplicaciones (separadas por comas) de ese recurso.

Entonces la pregunta es, ¿cuál es la mejor manera de hacer esto en SQL, ya que necesito obtener todos los recursos y también todas las aplicaciones para cada recurso?

¿Debo ejecutar primero una selección * de recursos y luego recorrer cada recurso y hacer una consulta separada por recurso para obtener la lista de aplicaciones para ese recurso?

¿Hay alguna manera de hacer esto en una consulta?

leora avatar Nov 30 '09 12:11 leora
Aceptado

mysql

  SELECT r.name,
         GROUP_CONCAT(a.name SEPARATOR ',')
    FROM RESOURCES r
    JOIN APPLICATIONSRESOURCES ar ON ar.resource_id = r.id
    JOIN APPLICATIONS a ON a.id = ar.app_id
GROUP BY r.name

Servidor SQL (2005+)

SELECT r.name,
       STUFF((SELECT ',' + a.name
               FROM APPLICATIONS a
               JOIN APPLICATIONRESOURCES ar ON ar.app_id = a.id
              WHERE ar.resource_id = r.id
           GROUP BY a.name
            FOR XML PATH(''), TYPE).value('text()[1]','NVARCHAR(max)'), 1, LEN(','), '')
 FROM RESOURCES r

Servidor SQL (2017+)

  SELECT r.name,
         STRING_AGG(a.name, ',')
    FROM RESOURCES r
    JOIN APPLICATIONSRESOURCES ar ON ar.resource_id = r.id
    JOIN APPLICATIONS a ON a.id = ar.app_id
GROUP BY r.name

Oráculo

Recomiendo leer sobre agregación/concatenación de cadenas en Oracle .

OMG Ponies avatar Nov 30 '2009 05:11 OMG Ponies

NOTA:

No se recomienda este método ya que puede dar resultados incorrectos o no deterministas.
Esto ha sido documentado en StackOverflow y DBA.

Uso de COALESCE para crear cadenas delimitadas por comas en SQL Server
http://www.sqlteam.com/article/using-coalesce-to-build-comma-delimited-string

Ejemplo:

DECLARE @EmployeeList varchar(100)

SELECT @EmployeeList = COALESCE(@EmployeeList + ', ', '') + 
   CAST(Emp_UniqueID AS varchar(5))
FROM SalesCallsEmployees
WHERE SalCal_UniqueID = 1

SELECT @EmployeeList
Robert Harvey avatar Nov 30 '2009 05:11 Robert Harvey