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