2010-12-29 21 views
8

キー値に基づいた属性を持つテーブルがあります。例:私はこの中から選択するとキー値テーブルのSQL Server PIVOT

CREATE TABLE ObjectAttributes 
(
    int objectId, key nvarchar(64), value nvarchar(512) 
) 

私が手に:私はにこれを有効にするPIVOTの構文を使用することができれば

objectId key  value 
---------------------------- 
1   Key 1 Value 1 
1   Key 2 Value 2 

私は思っていた:

objectId Key 1  Key 2 
--------------------------- 
1   Value 1 Value 2 

私はすべてを知っています私のテーブルは同じ鍵を持つでしょう。 (残念ながら、私は簡単にテーブルの構造を変更することはできません。これがPIVOTSを使用しようとしています)。

ここで大きな問題は、ピボットは集約関数を使用する必要があることです。これを避ける方法はありますか?私はこれを完全に間違っていますか?または、より良い解決策がありますか?

+0

固定列出力をしますか?つまり、指定されたobjectidのすべてのキーをピボットする必要がありますか? – gbn

答えて

7

ピボットは、固定列出力のための自己結合を高速化するものではありません。

SELECT 
    T1.objectID, T1.Value AS Key1, T2.Value AS Key2 
FROM 
    ObjectAttributes T1 
    JOIN 
    ObjectAttributes T2 ON T1.objectID = T2.objectID 
WHERE 
    T1.key = 'Key 1' 
    AND 
    T2.key = 'Key 2' 

PIVOTを使用する場合は、MAXを使用してください。オブジェクト/キーごとに1つの行があるため、とにかくそれは自明であり、PIVOTの要件を満たすためにそこにあります。

が未知数の行を列に追加する場合は、動的SQL(SQL Server 2000ソリューションごと)またはクライアントコードで実行します。

各オブジェクトに固定数の属性がある場合は、実際の列がトリガーによって保持された2番目の表があると考えます。不器用ですが、読書が楽になります

+0

ああ。私は、ピボットテーブルの背後にある種の魔法があったと仮定していました。私はセルフ・ジョイント・ルートに行くだけです。 – Kyle

+0

このソリューションには外部結合を使用できます。 1つのキーがない場合、ここで使用される内部結合で、出力オブジェクトIDの行全体が消えます。 –

+0

@Sir Wobin:フィルタをJOINにも移動します。 – gbn

5

いいえ、集計を避けることはできません。 SQL Serverでは、可能な限り多くの行を1つの値に結合する方法が必要です。あなたは1つの値を持っていますが、PIVOTの機能は多くの行を念頭に置いて作られています。

SELECT objectId, [Key 1], [Key 2] 
FROM 
(SELECT objectId, [key], value FROM ObjectAttributes) AS source 
PIVOT 
(
MIN(value) 
FOR [key] IN ([Key 1], [Key 2]) 
) as pvt 
関連する問題