2017-07-03 26 views
0

私はSQL Server 2008を使用しています。SQL Server - FOR複数の列のXML PATH

私はアイテムの一覧とそれらが属するカテゴリを持っています。

----------------------------------------------------------------- 
ItemId | Category1 | Category2 | Category3 | Category4 
----------------------------------------------------------------- 
1  | Val1, Val2 | Val3, Val4 | Val5, Val6 | Val7, Val8 
1  | Val9  |   |   |  
1  | Val10  | Val11  |   | 

* EDIT1

そこには、インデックスは、テーブルの上にされていないとアイテムIDは主キーではありません。 各項目は複数のカテゴリに属している可能性があります。

私はテーブルから別個のItemIdを選択し、可能なすべてのカテゴリを各列ごとにコンマで区切りたいと思います。

サンプル出力 -

------------------------------------------------------------------------------ 
ItemId | Category1    | Category2   | Category3 | Category4 
------------------------------------------------------------------------------ 
1  | Val1, Val2, Val9, Val10 | Val3, Val4, Val11 | Val5, Val6 | Val7, Val8 

私はこの使用してSTUFFを達成することができていますし、以下のクエリを使用してXML PATH FOR。しかし、私は実行計画を見て、それを行う最良の方法ではないように思えました。私は4つの異なるSELECTステートメントをカテゴリごとに使用しています。すべてを1つに統合できますか? 以下のクエリと同じ結果を得る最も効率的なクエリを探しています。

SELECT DISTINCT 
     t1.tblItemId, 
     STUFF((
     SELECT DISTINCT ',' + t2.Category1 
     FROM tblCategory t2 
     WHERE t1.tblItemId = t2.tblItemId 
     FOR XML PATH ('')), 1, 1, '') AS Category1, 
     STUFF((
     SELECT DISTINCT ',' + t2.Category2 
     FROM tblCategory t2 
     WHERE t1.tblItemId = t2.tblItemId 
     FOR XML PATH ('')), 1, 1, '') AS Category2,   
     STUFF((
     SELECT DISTINCT ',' + t2.Category3 
     FROM tblCategory t2 
     WHERE t1.tblItemId = t2.tblItemId 
     FOR XML PATH ('')), 1, 1, '') AS Category3,   
     STUFF((
     SELECT DISTINCT ',' + t2.Category4 
     FROM tblCategory t2 
     WHERE t1.tblItemId = t2.tblItemId 
     FOR XML PATH ('')), 1, 1, '') AS Category4 
FROM tblCategory t1 
where t1.tblItemId IS NOT NULL 

* Edit1 - 現在、複数の値がコンマで区切られた各行に存在しません。将来的には可能性があり、誰もそれを制限していないので、私はそれらを使いました。私は共通テーブル式を使用して、フロントエンドに使用できる望ましい出力を持つ一時テーブルを作成しています。

+1

このクエリは、[query()](https://docs.microsoft.com/en-us/sql/t-sql/xml/query-method)を使用すると簡略化できます。 -xml-data-type)メソッドを使用しても、パフォーマンスは現在の方法よりも悪くなります。 –

+3

これはひどいデータベース設計です。 [データベース列に区切られたリストを格納するのは本当に悪いですか?](http://stackoverflow.com/questions/3653462/is-storing-a-delimited-list-in-a-database-column-really-thatあなたがこの質問への答えが**である理由の多くを見ることができます**絶対にはい!** –

+0

こんにちはZohar、表示されている値は、目的例です。コンマ区切りの値は現時点では存在しませんが、可能性があります。私は現在、上記のクエリの共通テーブル式を使用しています。したがって、データベースにはカンマで区切られた値はありません。私はフロントエンドで使用するためのテーブルを形成するだけです。 – Vishwas

答えて

0

SQL CRLを使用して自分自身のSTRING_AGG(SQL 2016に表示されます)を書くことができます。 または既存のライブラリを使用する(例:http://groupconcat.codeplex.com/

関連する問題