Původní otázka byla specifická pro databázi, ale možná je to dobré místo pro zahrnutí obecnější odpovědi. Je to častá otázka. Koncept, který popisujete, je často označován jako 'Skupinové zřetězení'. V SQL-92 nebo SQL-99 není žádné standardní řešení. Budete tedy potřebovat řešení specifické pro dodavatele.
- MySQL - Použijte vestavěnou funkci GROUP_CONCAT. Ve vašem příkladu byste chtěli něco takového:
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 je nyní stejně jednoduchý, když je vestavěn string_agg (výraz, oddělovač). Tady je to s 'čárkou-mezera' mezi prvky:
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 starší než 9.0 vám umožňuje definovat vlastní agregační funkce pomocí CREATE AGGREGATE. O něco více práce než MySQL, ale mnohem flexibilnější. Podívejte se na tento jiný příspěvek Více podrobností. (Samozřejmě PostgreSQL 9.0 a novější mají tuto možnost také.)
-
Oracle - stejný nápad pomocí LISTAGG .
-
MS SQL Server - stejný nápad pomocí STRING_AGG
-
Záložní řešení - v jiných databázových technologiích nebo ve velmi starých verzích technologií uvedených výše nemáte tyto funkce zřetězení skupin. V takovém případě vytvořte uloženou proceduru, která vezme org_id jako svůj vstup a vydá zřetězená jména zaměstnanců. Potom použijte tuto uloženou proceduru ve svém dotazu. Některé z dalších odpovědí zde obsahují některé podrobnosti o tom, jak psát uložené procedury, jako jsou tyto.
select o.ID, o.Address, o.OtherDetails, MY_CUSTOM_GROUP_CONCAT_PROCEDURE( o.ID ) as Employees from organization o