2012-04-26 5 views
1

私はこのようなテーブルを持ってつかむ:だからのOracle SQLは - 複数の行からの値

TABLE: FACTS 
ID  KEY   VALUE 
1  name  Jeremy 
1  height  5'11 
1  awesomeness 10 
2  name  Mark 
2  awesomeness 4 
3  height  4'6 

を、(ID、KEY)タプルは主キーとして考えることができます。

私はこのような行を返すようにしようとしています

:彼らがある場合は、サブ選択各列の操作を実行して、どのように、キーの値をつかむことができ、そして私にそれらを集めるよりも、だから、他の

ID  NAME  HEIGHT AWESOMENESS 
1  Jeremy 5'11  10 
2  Mark  (null) 4 
3  (null) 4'6  (null) 

を一列ですか?私がこれまでに試したのは:

しかし明らかな理由から、これはidごとに1つの行ではなく、一致するキーごとに1つの行を返します。

私はこれをどのようにして得ることができますか?

ありがとうございます!

答えて

5

どのバージョンのOracleでも、このようにデータをピボットすることができます。

SELECT id, 
     MAX(CASE WHEN key = 'name' THEN value ELSE null END) name, 
     MAX(CASE WHEN key = 'height' THEN value ELSE null END) height, 
     MAX(CASE WHEN key = 'awesomeness' THEN value ELSE null END) awesomeness 
    FROM facts 
WHERE id IN (1,2,3) 
GROUP BY id 

11gを使用している場合は、PVOT演算子を使用することもできます。

これがあなたのデータモデルの代表である場合、その種のエンティティ属性データモデルは一般的にむしろ非効率的になります。あなたは、一般的にはるかに良いnameの列を持っていたテーブルを添えて、heightawesomenessなど

+0

10秒先に私のだろう、と同じクエリのわずか整然とバージョンで:/ –

+0

ふむ、あなたは両方ともに私を打ちますそれは –

+0

素晴らしいですし、完璧に動作しますが、私はそれを取得しません。ここでの論理は何ですか?なぜ、minの代わりに最大の理由は? (このテーブルは、ユーザが任意のキーを作成できるシステムをサポートしていますので、このようなものに裏付けされている必要があります) – Jeremy

関連する問題