La pregunta original era específica de la base de datos, pero quizás este sea un buen lugar para incluir una respuesta más genérica. Es una pregunta común. El concepto que está describiendo a menudo se denomina 'Concatenación de grupos'. No hay una solución estándar en SQL-92 o SQL-99. Por lo tanto, necesitará una solución específica del proveedor.
- MySQL - Utilice la función integrada GROUP_CONCAT. En tu ejemplo, querrías algo como esto:
select o.ID, o.Address, o.OtherDetails, GROUP_CONCAT( concat(e.firstname, ' ', e.lastname) ) as Employees from employees e inner join organization o on o.org_id=e.org_id group by o.org_id
- PostgreSQL - PostgreSQL 9.0 es igualmente simple ahora que string_agg (expresión, delimitador) está incorporado. Aquí está con 'coma-espacio' entre elementos:
select o.ID, o.Address, o.OtherDetails, STRING_AGG( (e.firstname || ' ' || e.lastname), ', ' ) as Employees from employees e inner join organization o on o.org_id=e.org_id group by o.org_id
PostgreSQL anterior a 9.0 le permite definir sus propias funciones agregadas con CREATE AGGREGATE. Un poco más de trabajo que MySQL, pero mucho más flexible. Vea esto otra publicación para más detalles. (Por supuesto, PostgreSQL 9.0 y versiones posteriores también tienen esta opción).
-
Oráculo - misma idea usando LISTAGG .
-
Servidor MS SQL - misma idea usando STRING_AGG
-
Solución alternativa - en otras tecnologías de base de datos o en versiones muy antiguas de las tecnologías enumeradas anteriormente, no tiene estas funciones de concatenación de grupos. En ese caso, cree un procedimiento almacenado que tome org_id como su entrada y genere los nombres de los empleados concatenados. Luego use este procedimiento almacenado en su consulta. Algunas de las otras respuestas aquí incluyen algunos detalles sobre cómo escribir procedimientos almacenados como estos.
select o.ID, o.Address, o.OtherDetails, MY_CUSTOM_GROUP_CONCAT_PROCEDURE( o.ID ) as Employees from organization o