¿Cómo creo una lista separada por comas mediante una consulta SQL?
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?
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 .
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