Pierwotne pytanie dotyczyło bazy danych, ale być może jest to dobre miejsce na podanie bardziej ogólnej odpowiedzi. To częste pytanie. Pojęcie, które opisujesz, jest często określane jako „Połączenie grupowe”. Nie ma standardowego rozwiązania w SQL-92 lub SQL-99. Potrzebujesz więc rozwiązania specyficznego dla dostawcy.
- MySQL - Użyj wbudowanej funkcji GROUP_CONCAT. W twoim przykładzie chciałbyś coś takiego:
- PostgreSQL - PostgreSQL 9.0 jest równie prosty teraz, gdy wbudowany jest string_agg(wyrażenie, delimiter). Tutaj jest z „przecinkiem” między elementami:
wybierz o.ID, o.Adres, o.OtherDetails, STRING_AGG( (e.imię || ' ' || e.nazwisko), ', ' ) jako Pracownicyod pracowników e wewnętrzna organizacja przyłączenia o na o.org_id=e.org_idgroup od o.org_id
PostgreSQL przed wersją 9.0 umożliwia definiowanie własnych funkcji agregujących za pomocą CREATE AGGREGATE. Nieco więcej pracy niż MySQL, ale znacznie bardziej elastyczny. Zobacz to inny post po więcej szczegółów. (Oczywiście PostgreSQL 9.0 i nowsze również mają tę opcję.)
-
Wyrocznia - ten sam pomysł przy użyciu LISTAGG .
-
Serwer MS SQL - ten sam pomysł przy użyciu STRING_AGG
-
Rozwiązanie awaryjne - w innych technologiach baz danych lub w bardzo bardzo starych wersjach technologii wymienionych powyżej nie masz tych funkcji łączenia grup. W takim przypadku utwórz procedurę składowaną, która pobiera org_id jako dane wejściowe i wyprowadza połączone nazwiska pracowników. Następnie użyj tej procedury składowanej w zapytaniu. Niektóre z innych odpowiedzi tutaj zawierają pewne szczegóły dotyczące pisania procedur składowanych, takich jak te.
wybierz o.ID, o.Adres, o.OtherDetails, MY_CUSTOM_GROUP_CONCAT_PROCEDURE( o.ID ) jako Pracownicy z organizacji o