ホームページ >データベース >mysql チュートリアル >SQL で 1 対多の関係からデータを効率的に連結するにはどうすればよいですか?
SQL における 1 対多のリレーションシップのためのグループ連結のマスター
リレーショナル データベースでは、多くの場合、テーブルから情報を取得する必要があります。 1 対多の関係があります。一般的なシナリオは、親レコードと関連する子レコードに関するデータを収集することです。
各組織が複数の従業員を持つことができる組織テーブルと従業員テーブルの例を考えてみましょう。特定の組織に関するすべての情報とその全従業員の名を取得するには、さまざまなアプローチを検討します。
標準 SQL テクニック
残念ながら、標準 SQL- 92 および SQL-99 には、グループ連結用の組み込み関数が含まれていません。ベンダー固有のソリューションが必要です。
MySQL
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;
Oracle
Oracle は LISTAGG 関数を利用します:
SELECT o.ID, o.Address, o.OtherDetails, LISTAGG(e.FirstName || ' ' || e.LastName, ', ') WITHIN GROUP (ORDER BY e.FirstName) AS Employees FROM Employees e INNER JOIN Organization o ON o.Org_ID = e.Org_ID GROUP BY o.Org_ID;
フォールバック ソリューション
ベンダー固有の機能が利用できない場合、ストアド プロシージャは連結を実行するために作成されました。
ストアド プロシージャの例 (汎用)
CREATE PROCEDURE MY_CUSTOM_GROUP_CONCAT_PROCEDURE ( @Org_ID INT ) AS BEGIN DECLARE @Employees NVARCHAR(MAX) = ''; SELECT @Employees = @Employees + FirstName + ' ' + LastName + ', ' FROM Employees WHERE Org_ID = @Org_ID; SELECT @Employees = LEFT(@Employees, LEN(@Employees) - 2); RETURN @Employees; END GO;
使用法
SELECT o.ID, o.Address, o.OtherDetails, MY_CUSTOM_GROUP_CONCAT_PROCEDURE(o.ID) AS Employees FROM Organization o;
Byこれらの技術を活用することで、開発者は 1 つのレコードに関連付けられた複数のレコード情報を効率的に取得でき、 1 対多の関係におけるデータの全体的なビュー。
以上がSQL で 1 対多の関係からデータを効率的に連結するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。