元の質問はデータベース固有でしたが、おそらくこれはより一般的な回答を含めるのに適した場所です。よくある質問です。あなたが説明している概念は、しばしば「グループ連結」と呼ばれます。 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 --string_agg(expression、delimiter)が組み込まれているため、PostgreSQL9.0も同様にシンプルです。ここでは、要素間に「コンマスペース」があります:
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
9.0より前のPostgreSQLでは、CREATEAGGREGATEを使用して独自の集計関数を定義できます。 MySQLよりも少し多くの作業がありますが、はるかに柔軟性があります。これを参照してください
-
オラクル - 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