ホームページ >データベース >mysql チュートリアル >CLR 集計関数を使用せずに SQL Azure で文字列を最適に連結するにはどうすればよいですか?

CLR 集計関数を使用せずに SQL Azure で文字列を最適に連結するにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2025-01-20 09:16:10579ブラウズ

How Can I Optimally Concatenate Strings in SQL Azure Without CLR Aggregate Functions?

SQL Azure 文字列の効率的な接続ソリューション

SQL Azure では、異種の文字列データを 1 つのエンティティに効率的に集約することが重要です。 SQL Azure には CLR カスタム集計関数が欠如しているため、効率的な代替関数を見つける必要があります。

トランザクション SQL ソリューション

効率的な方法は、WITH 句と再帰 CTE (共通テーブル式) を使用することです。このメソッドには以下が含まれます:

  1. ROW_NUMBER() と PARTITION BY を使用して、パーティション内の行に番号を付け、結合順序を定義します。
  2. 再帰 CTE (連結) を繰り返し使用して、連結文字列を構築します。
  3. 最終的な集計結果 (NameNumber = NameCount) のみを含むように結果をフィルターします。

説明

次のお問い合わせをご検討ください:

<code class="language-sql">;WITH Partitioned AS
(
    SELECT 
        ID,
        Name,
        ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Name) AS NameNumber,
        COUNT(*) OVER (PARTITION BY ID) AS NameCount
    FROM dbo.SourceTable
),
Concatenated AS
(
    SELECT 
        ID, 
        CAST(Name AS nvarchar(max)) AS FullName, 
        Name, 
        NameNumber, 
        NameCount 
    FROM Partitioned 
    WHERE NameNumber = 1

    UNION ALL

    SELECT 
        P.ID, 
        CAST(C.FullName + ', ' + P.Name AS nvarchar(max)), 
        P.Name, 
        P.NameNumber, 
        P.NameCount
    FROM Partitioned AS P
        INNER JOIN Concatenated AS C 
                ON P.ID = C.ID 
                AND P.NameNumber = C.NameNumber + 1
)
SELECT 
    ID,
    FullName
FROM Concatenated
WHERE NameNumber = NameCount;</code>

次のデータの場合:

<code>ID      Name
------- --------
1       Matt
1       Rocks
2       Stylus
3       Foo
3       Bar
3       Baz</code>

次の集計結果を返します:

<code>ID      FullName
------- ---------------------
1       Matt, Rocks
2       Stylus
3       Foo, Bar, Baz</code>

メリット

  • SQL Azure の場合
  • 特に小規模なデータセットの場合、比較的効率的です
  • 特定の接続シナリオに合わせてカスタマイズが簡単 (ソート順、区切り文字など)

注: nvarchar データ型の長さのオーバーフローを回避するには、CAST の型を nvarchar(max) に変更します。 また、例の結果の並べ替えは元のテキストと若干異なります。これは、ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Name) の並べ替えの基準が [名前] フィールドであるため、並べ替え結果が異なります。 特定の並べ替え方法が必要な場合は、ORDER BY 句を変更します。

以上がCLR 集計関数を使用せずに SQL Azure で文字列を最適に連結するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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