1

次のようなテーブルがあります。

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)

では、列ごとにサブ選択を行う以外に、キー値が存在する場合、それらを取得して単一の行に収集するにはどうすればよいでしょうか? これまでに試したことは次のとおりです。

SELECT 
  id,
  CASE WHEN facts.key = 'name' THEN value END name,
  CASE WHEN facts.key = 'height' THEN value END height,
  CASE when facts.key = 'awesomeness' THEN value END awesomeness
FROM
  facts
WHERE
  facts.id in (1,2,3)

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

これを希望どおりにするにはどうすればよいですか?

ありがとう!

4

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、 などの列を持つテーブルを使用すると、はるかに優れたサービスが提供されます。

于 2012-04-26T01:44:51.790 に答える