Oracle SQL - 从多行中获取值

时间:2012-04-26 01:37:34

标签: sql oracle pivot dynamic-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)

除了为每个列做一个子选择之外,如何获取键值,如果它们在那里,并将它们收集到我的单行中?到目前为止我尝试的是:

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 个答案:

答案 0 :(得分: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运算符。

如果这代表了您的数据模型,那么这种实体属性数据模型通常效率很低。对于包含nameheightawesomeness等列的表格,您通常可以获得更好的服务。