私は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 - 現在、複数の値がコンマで区切られた各行に存在しません。将来的には可能性があり、誰もそれを制限していないので、私はそれらを使いました。私は共通テーブル式を使用して、フロントエンドに使用できる望ましい出力を持つ一時テーブルを作成しています。
このクエリは、[query()](https://docs.microsoft.com/en-us/sql/t-sql/xml/query-method)を使用すると簡略化できます。 -xml-data-type)メソッドを使用しても、パフォーマンスは現在の方法よりも悪くなります。 –
これはひどいデータベース設計です。 [データベース列に区切られたリストを格納するのは本当に悪いですか?](http://stackoverflow.com/questions/3653462/is-storing-a-delimited-list-in-a-database-column-really-thatあなたがこの質問への答えが**である理由の多くを見ることができます**絶対にはい!** –
こんにちはZohar、表示されている値は、目的例です。コンマ区切りの値は現時点では存在しませんが、可能性があります。私は現在、上記のクエリの共通テーブル式を使用しています。したがって、データベースにはカンマで区切られた値はありません。私はフロントエンドで使用するためのテーブルを形成するだけです。 – Vishwas