Mysql
 sql >> Database >  >> RDS >> Mysql

Come ottenere più record su un record in base alla relazione?

La domanda originale era specifica del database, ma forse questo è un buon posto per includere una risposta più generica. È una domanda comune. Il concetto che stai descrivendo viene spesso definito "Concatenazione di gruppi". Non esiste una soluzione standard in SQL-92 o SQL-99. Quindi avrai bisogno di una soluzione specifica del fornitore.

  • MySQL - Utilizzare la funzione GROUP_CONCAT incorporata. Nel tuo esempio vorresti qualcosa del genere:
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 è altrettanto semplice ora che string_agg(espressione, delimitatore) è integrato. Eccolo con 'virgola-spazio' tra gli elementi:
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 prima della 9.0 ti consente di definire le tue funzioni aggregate con CREATE AGGREGATE. Leggermente più lavoro di MySQL, ma molto più flessibile. Vedi questo altro post per ulteriori dettagli. (Naturalmente anche PostgreSQL 9.0 e versioni successive hanno questa opzione.)

  • Oracolo - stessa idea usando LISTAGG .

  • Server MS SQL - stessa idea usando STRING_AGG

  • Soluzione di riserva - in altre tecnologie di database o in versioni molto molto vecchie delle tecnologie sopra elencate non hai queste funzioni di concatenazione di gruppi. In tal caso, creare una procedura memorizzata che prenda org_id come input e restituisca i nomi dei dipendenti concatenati. Quindi utilizzare questa procedura memorizzata nella query. Alcune delle altre risposte qui includono alcuni dettagli su come scrivere procedure archiviate come queste.

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