ホームページ >データベース >mysql チュートリアル >SQL Server と Oracle で複数の行をカンマ区切りのリストに連結するにはどうすればよいですか?

SQL Server と Oracle で複数の行をカンマ区切りのリストに連結するにはどうすればよいですか?

DDD
DDDオリジナル
2025-01-21 06:42:12757ブラウズ

How to Concatenate Multiple Rows into a Comma-Separated List in SQL Server and Oracle?

複数の SQL 行を単一のカンマ区切り列に集約する

この記事では、共通の識別子を共有する複数の行を、特定の列のカンマ区切りリストを使用して 1 つの行に統合する方法を説明します。 この例では、チケット ID と関連する個人を含むテーブルを使用し、各チケット ID が関係するすべての個人のリストにリンクされる結果を作成することを目的としています。

SQL Server アプローチ (2005 以降)

次の SQL Server クエリは、STUFF()ISNULL()、および FOR XML PATH を使用してこれを実現します。

<code class="language-sql">SELECT t.TicketID,
       STUFF(ISNULL((SELECT ', ' + x.Person
                FROM @Tickets x
               WHERE x.TicketID = t.TicketID
            GROUP BY x.Person
             FOR XML PATH (''), TYPE).value('.','VARCHAR(max)'), ''), 1, 2, '') [No Preceeding Comma],
       ISNULL((SELECT ', ' + x.Person
                FROM @Tickets x
               WHERE x.TicketID = t.TicketID
            GROUP BY x.Person
             FOR XML PATH (''), TYPE).value('.','VARCHAR(max)'), '') [Preceeding Comma If Not Empty]
  FROM @Tickets t
GROUP BY t.TicketID</code>

このクエリはサブクエリを使用して、各 TicketID に関連付けられた個人を収集します。 FOR XML PATH メソッドは結果を連結文字列に変換し、STUFF() で先頭のカンマを削除します。 ISNULL() 関数は、チケットに関連付けられている個人が存在しない場合を処理します。 オプションの列を使用すると、先頭のカンマを柔軟に処理できます。

Oracle ソリューション

Oracle は、LISTAGG() 関数を使用したより簡潔なソリューションを提供しています。

<code class="language-sql">SELECT TicketID,
       LISTAGG(Person, ',') WITHIN GROUP (ORDER BY Person) OVER (PARTITION BY TicketID) AS People
  FROM @Tickets</code>

LISTAGG() は、値を Person 列で順序付けされたカンマ区切りのリストに直接集計します。 PARTITION BY 句により、個別の TicketID ごとに集計が確実に行われます。 この方法は、SQL Server の同等の方法よりも大幅にシンプルで効率的です。

以上がSQL Server と Oracle で複数の行をカンマ区切りのリストに連結するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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