Первоначальный вопрос был специфичен для базы данных, но, возможно, это хорошее место, чтобы включить более общий ответ. Это общий вопрос. Концепцию, которую вы описываете, часто называют «объединением групп». Там нет стандартного решения в 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 (выражение, разделитель). Вот с запятой между элементами:
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 и новее также имеют эту опцию.)
- Oracle & MS SQL Server - Создайте хранимую процедуру, которая принимает org_id в качестве входных данных и выводит объединенные имена сотрудников. Затем используйте эту хранимую процедуру в своем запросе. Некоторые другие ответы здесь включают некоторые детали о том, как писать хранимые процедуры, подобные этим.
select
o.ID, o.Address, o.OtherDetails,
MY_CUSTOM_GROUP_CONCAT_PROCEDURE( o.ID ) as Employees
from
organization o
- Другие технологии СУБД - Наиболее вероятен маршрут хранимой процедуры. Возможно, другие могут обновить этот ответ более специфичными для технологии ответами.