sql >> Database >  >> RDS >> Mysql

Hoe meerdere records tegen één record te krijgen op basis van een relatie?

De oorspronkelijke vraag was databasespecifiek, maar misschien is dit een goede plek om een ​​meer generiek antwoord op te nemen. Het is een veel voorkomende vraag. Het concept dat u beschrijft wordt vaak 'Groepsaaneenschakeling' genoemd. Er is geen standaardoplossing in SQL-92 of SQL-99. U hebt dus een leverancierspecifieke oplossing nodig.

  • MySQL - Gebruik de ingebouwde functie GROUP_CONCAT. In jouw voorbeeld zou je zoiets als dit willen:
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 is net zo eenvoudig nu string_agg(expression, delimiter) is ingebouwd. Hier is het met 'komma-spatie' tussen elementen:
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

Met PostgreSQL voor 9.0 kunt u uw eigen aggregatiefuncties definiëren met CREATE AGGREGATE. Iets meer werk dan MySQL, maar veel flexibeler. Zie deze ander bericht voor meer details. (Natuurlijk hebben PostgreSQL 9.0 en hoger deze optie ook.)

  • Oracle - hetzelfde idee met LISTAGG .

  • MS SQL Server - hetzelfde idee met STRING_AGG

  • Terugvaloplossing - in andere databasetechnologieën of in zeer oude versies van de hierboven genoemde technologieën beschikt u niet over deze groepsaaneenschakelingsfuncties. Maak in dat geval een opgeslagen procedure die de org_id als invoer neemt en de aaneengeschakelde werknemersnamen uitvoert. Gebruik dan deze opgeslagen procedure in uw query. Sommige van de andere reacties hier bevatten details over het schrijven van opgeslagen procedures zoals deze.

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


  1. 5 redenen waarom Microsoft Access geweldig is voor startups

  2. geen pg_hba.conf invoer voor host

  3. Hoe kan ik dubbele rijen verwijderen?

  4. Hoe de UPPER()-functie werkt in MySQL