Pierwotne pytanie dotyczyło konkretnej bazy danych, ale być może jest to dobre miejsce na bardziej ogólną odpowiedź. To częste pytanie. Pojęcie, które opisujesz, jest często określane jako "Grupowanie konkatenacji". Nie ma standardowego rozwiązania w SQL-92 lub SQL-99. Potrzebujesz więc rozwiązania specyficznego dla dostawcy.
- MySQL - Prawdopodobnie najprostsze rozwiązanie. Użyj wbudowanej funkcji GROUP_CONCAT. W przykładzie chciałbyś coś takiego:
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 - EDIT: PostgreSQL 9.0 jest teraz równie proste, że string_agg (wyrażenie, separator) jest wbudowany. Tutaj jest z „przecinkami przestrzeni” pomiędzy elementami:
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
przed PostgreSQL 9.0 pozwala definiować własne funkcje agregujące CREATE kruszywa. Nieco więcej pracy niż MySQL, ale o wiele bardziej elastyczna. Więcej szczegółów można znaleźć pod numerem other post. (Oczywiście PostgreSQL 9.0 i później mieć tę opcję, jak również.)
- Oracle & MS SQL Server - Utwórz procedurę przechowywaną, która bierze org_id jako wejścia i wyjścia do złączonych nazwisk pracowników. Następnie użyj tej procedury przechowywanej w zapytaniu. Niektóre inne odpowiedzi tutaj zawierają pewne szczegóły dotyczące pisania procedur przechowywanych, takich jak te.
select
o.ID, o.Address, o.OtherDetails,
MY_CUSTOM_GROUP_CONCAT_PROCEDURE(o.ID) as Employees
from
organization o
- Inne technologie DBMS - Zapisana trasa procedura jest najbardziej prawdopodobne. Być może inni mogą zaktualizować tę odpowiedź za pomocą odpowiedzi na więcej technologii.
Oczywiście, jak tylko jako suma wszystkich swoich pracowników nazwisk, plus przecinki i przestrzenie osiągają 8000 - masz problem! – Valerion