ホームページ >データベース >mysql チュートリアル >SQL で 1 対多の関係からデータを効率的に連結するにはどうすればよいですか?

SQL で 1 対多の関係からデータを効率的に連結するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-29 12:02:12180ブラウズ

How to Efficiently Concatenate Data from One-to-Many Relationships in SQL?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。