sql >> データベース >  >> RDS >> Sqlserver

サブクエリからの複数の行を単一の区切りフィールドに結合するSQLServer関数を作成するにはどうすればよいですか?

    SQL Server 2005を使用している場合は、FORXMLPATHコマンドを使用できます。

    SELECT [VehicleID]
         , [Name]
         , (STUFF((SELECT CAST(', ' + [City] AS VARCHAR(MAX)) 
             FROM [Location] 
             WHERE (VehicleID = Vehicle.VehicleID) 
             FOR XML PATH ('')), 1, 2, '')) AS Locations
    FROM [Vehicle]
    

    カーソルを使用するよりもはるかに簡単で、かなりうまく機能しているようです。

    更新

    新しいバージョンのSQLServerでこのメソッドをまだ使用している場合は、STRING_AGGを使用すると、少し簡単でパフォーマンスが向上する別の方法があります。 SQLServer2017以降で使用できるメソッド。

    SELECT  [VehicleID]
           ,[Name]
           ,(SELECT STRING_AGG([City], ', ')
             FROM [Location]
             WHERE VehicleID = V.VehicleID) AS Locations
    FROM   [Vehicle] V
    

    これにより、2番目のパラメーターとして別のセパレーターを指定できるようになり、前者の方法よりも少し柔軟性が高まります。



    1. SQL Server(T-SQL)でパーティション化されたテーブルのパーティション化列を検索する

    2. カスタム列名を使用した外部キ​​ーのマッピング

    3. 同じテーブルの2つの行を比較する方法

    4. SQLFORXMLを使用してHTMLテーブルを作成する