Den ursprungliga frågan var databasspecifik, men det här är kanske ett bra ställe att inkludera ett mer allmänt svar. Det är en vanlig fråga. Konceptet som du beskriver kallas ofta för "gruppsammankoppling". Det finns ingen standardlösning i SQL-92 eller SQL-99. Så du behöver en leverantörsspecifik lösning.
- MySQL - Använd den inbyggda GROUP_CONCAT-funktionen. I ditt exempel skulle du vilja ha något sånt här:
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 är lika enkelt nu när string_agg(uttryck, avgränsare) är inbyggt. Här är det med 'komma-mellanslag' mellan 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
PostgreSQL före 9.0 låter dig definiera dina egna aggregerade funktioner med CREATE AGGREGATE. Lite mer arbete än MySQL, men mycket mer flexibelt. Se denna annat inlägg för mer detaljer. (Självklart har PostgreSQL 9.0 och senare detta alternativ också.)
-
Oracle - Samma idé med LISTAGG .
-
MS SQL Server - samma idé med STRING_AGG
-
Reservlösning - i andra databasteknologier eller i mycket gamla versioner av teknikerna som anges ovan har du inte dessa gruppsammankopplingsfunktioner. Skapa i så fall en lagrad procedur som tar org_id som indata och matar ut de sammanlänkade medarbetarnamnen. Använd sedan denna lagrade procedur i din fråga. Några av de andra svaren här inkluderar några detaljer om hur man skriver lagrade procedurer som dessa.
select o.ID, o.Address, o.OtherDetails, MY_CUSTOM_GROUP_CONCAT_PROCEDURE( o.ID ) as Employees from organization o