組織に関連付けられた複数の従業員レコードを単一の結果セットで取得する
当面のタスクには、指定された組織のすべての詳細を取得することが含まれます従業員のファーストネームも一緒に。 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 JOIN organization o ON o.org_id=e.org_id GROUP BY o.org_id;
PostgreSQL 9.0 では、STRING_AGG 関数を使用した同様に簡単なソリューションが提供されます。
SELECT o.ID, o.Address, o.OtherDetails, STRING_AGG( (e.firstname || ' ' || e.lastname), ', ' ) AS Employees FROM employees e JOIN organization o ON o.org_id=e.org_id GROUP BY o.org_id;
9.0 より前のバージョンの PostgreSQL では、CREATE AGGREGATE コマンドを使用すると、カスタム集計関数を定義できます。
Oracle は LISTAGG を採用しています同様の機能については、MS SQL Server は STRING_AGG を使用します。
組み込みのグループ連結関数がない場合、フォールバック オプションでは、入力として組織 ID を受け取り、連結された従業員名を返すストアド プロシージャを作成する必要があります。 。このストアド プロシージャはクエリ内で利用できます。
SELECT o.ID, o.Address, o.OtherDetails, MY_CUSTOM_GROUP_CONCAT_PROCEDURE( o.ID ) AS Employees FROM organization o;
これらのベンダー固有のアプローチを採用することで、単一の結果セットで単一の組織に関連する複数の従業員レコードを取得できます。
以上が単一の SQL クエリで特定の組織のすべての従業員レコードを取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。