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