ホームページ >データベース >mysql チュートリアル >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 サイトの他の関連記事を参照してください。