Първоначалният въпрос беше специфичен за базата данни, но може би това е добро място да включите по-общ отговор. Това е често срещан въпрос. Концепцията, която описвате, често се нарича "групова конкатенация". Няма стандартно решение в SQL-92 или SQL-99. Така че ще ви трябва решение, специфично за доставчика.
- MySQL - Използвайте вградената функция GROUP_CONCAT. Във вашия пример бихте искали нещо подобно:
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 е също толкова прост сега, когато string_agg(expression, delimiter) е вграден. Ето го с „запетая“ между елементите:
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 преди 9.0 ви позволява да дефинирате свои собствени агрегатни функции с CREATE AGGREGATE. Малко повече работа от MySQL, но много по-гъвкава. Вижте това друга публикация за повече информация. (Разбира се, PostgreSQL 9.0 и по-нови версии също имат тази опция.)
-
Оракул - същата идея с помощта на LISTAGG .
-
MS SQL Server - същата идея с помощта на STRING_AGG
-
Резервно решение - в други технологии за бази данни или в много много стари версии на технологиите, изброени по-горе, нямате тези функции за групова конкатенация. В този случай създайте съхранена процедура, която приема org_id като вход и извежда конкатенираните имена на служители. След това използвайте тази съхранена процедура във вашата заявка. Някои от другите отговори тук включват някои подробности за това как да се напишат съхранени процедури като тези.
select o.ID, o.Address, o.OtherDetails, MY_CUSTOM_GROUP_CONCAT_PROCEDURE( o.ID ) as Employees from organization o