ホームページ > データベース > mysql チュートリアル > SQL Server でサブクエリの行を効率的に連結するにはどうすればよいですか?

SQL Server でサブクエリの行を効率的に連結するにはどうすればよいですか?

Linda Hamilton
リリース: 2025-01-22 00:15:10
オリジナル
789 人が閲覧しました

How Can I Efficiently Concatenate Rows from a Subquery in SQL Server?

SQL Server の行連結: カスタム関数と最新のアプローチ

この記事では、SQL Server 内のサブクエリの行を効率的に連結して、区切り文字で区切られた 1 つの文字列を生成する 2 つの方法を説明します。 1 つ目はカスタム関数を使用し、さまざまな SQL Server バージョン間での互換性を提供します。 2 つ目は、SQL Server 2017 以降で利用可能な STRING_AGG 関数を利用して、パフォーマンスを向上させます。

方法 1: JoinRows ユーザー定義関数

SQL Server のバージョン互換性をより広範にするために、カスタム関数がクリーンなソリューションを提供します。 以下の JoinRows 関数は区切り文字とテーブルを入力として受け取り、連結された文字列を返します:

<code class="language-sql">CREATE FUNCTION JoinRows (
    @Separator CHAR(1),
    @InputTable TABLE (ID INT, Value VARCHAR(MAX))
)
RETURNS VARCHAR(MAX)
BEGIN
    RETURN (
        SELECT COALESCE(@Separator + I.Value, I.Value)
        FROM @InputTable AS I
        FOR XML PATH('')
    );
END;</code>
ログイン後にコピー

この関数は次のようにクエリに統合できます:

<code class="language-sql">SELECT
    VehicleID,
    Name,
    JoinRows(', ', (SELECT City FROM Location WHERE VehicleID = Vehicles.VehicleID)) AS Locations
FROM Vehicles;</code>
ログイン後にコピー

方法 2: STRING_AGG (SQL Server 2017 以降)

SQL Server 2017 以降のバージョンの場合、組み込み STRING_AGG 関数は、より合理化され、多くの場合高速なアプローチを提供します。

<code class="language-sql">SELECT
    VehicleID,
    Name,
    STRING_AGG(City, ', ') WITHIN GROUP (ORDER BY City) AS Locations
FROM Vehicles
INNER JOIN Location ON Vehicles.VehicleID = Location.VehicleID
GROUP BY VehicleID, Name;</code>
ログイン後にコピー

このメソッドは、Vehicles テーブルと Location テーブルを直接結合し、STRING_AGG を使用して City 値を集計し、VehicleID でパーティション化して、新しい SQL Server インスタンスにより効率的なソリューションを提供します。 連結された都市の予測可能な順序のために WITHIN GROUP (ORDER BY City) が追加されていることに注意してください。 これはオプションですが、一貫した結果を得るために推奨されます。 GROUP BY 句も、正しい集計を保証するために必要です。

SQL Server のバージョンとパフォーマンス要件に最も適した方法を選択してください。 古いバージョンの場合は、カスタム関数が必要です。新しいバージョンでは、STRING_AGG によりパフォーマンスが大幅に向上します。

以上がSQL Server でサブクエリの行を効率的に連結するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート