Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment obtenir plusieurs enregistrements contre un enregistrement basé sur la relation ?

La question initiale était spécifique à la base de données, mais c'est peut-être un bon endroit pour inclure une réponse plus générique. C'est une question courante. Le concept que vous décrivez est souvent appelé « concaténation de groupe ». Il n'y a pas de solution standard dans SQL-92 ou SQL-99. Vous aurez donc besoin d'une solution spécifique au fournisseur.

  • MySQL - Utilisez la fonction intégrée GROUP_CONCAT. Dans votre exemple, vous voudriez quelque chose comme ceci :
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 est tout aussi simple maintenant que string_agg(expression, délimiteur) est intégré. Le voici avec 'virgule-espace' entre les éléments :
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 avant 9.0 vous permet de définir vos propres fonctions d'agrégat avec CREATE AGGREGATE. Un peu plus de travail que MySQL, mais beaucoup plus flexible. Voir ceci autre message pour plus de détails. (Bien sûr, PostgreSQL 9.0 et versions ultérieures ont également cette option.)

  • Oracle - même idée en utilisant LISTAGG .

  • MS SQL Server - même idée en utilisant STRING_AGG

  • Solution de repli - dans d'autres technologies de bases de données ou dans des versions très très anciennes des technologies listées ci-dessus vous n'avez pas ces fonctions de concaténation de groupe. Dans ce cas, créez une procédure stockée qui prend org_id comme entrée et génère les noms d'employés concaténés. Utilisez ensuite cette procédure stockée dans votre requête. Certaines des autres réponses ici incluent des détails sur la façon d'écrire des procédures stockées comme celles-ci.

select 
  o.ID, o.Address, o.OtherDetails,
  MY_CUSTOM_GROUP_CONCAT_PROCEDURE( o.ID ) as Employees
from 
  organization o