sql >> Base de Datos >  >> RDS >> Mysql

¿Cómo obtener múltiples registros contra un registro basado en la relación?

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