Oracle SQL--从多行获取值

Oracle SQL--从多行获取值,sql,oracle,pivot,dynamic-sql,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 NAME HEIGHT AWESOMENESS 1 J

我有一张这样的桌子:

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     NAME     HEIGHT    AWESOMENESS
1      Jeremy   5'11      10
2      Mark     (null)    4
3      (null)   4'6       (null)
因此,(ID,KEY)元组可以被视为主键

我尝试返回如下行:

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     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返回一行

我怎样才能得到我想要的


谢谢

在任何版本的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
height
awesomeness
等列,您会得到更好的服务。

10秒前,同样查询的版本稍微整洁一些:/这很好,工作得很好,但我不明白。这里的逻辑是什么?比如说,为什么是max而不是min?(请注意,此表支持用户可以创建任意键的系统,因此有必要使用类似的方法来支持它)@Jeremy-如果有多行,只要其中一行为非空,任何返回非空值的聚合函数都足够了
MIN
也应该起作用——选择
MAX