2012-04-26 68 views
1

敛值I有一个表是这样的:的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) 

所以比做其他子选择为每个列,怎么能抢键值,如果他们在那里,并收集他们进入我的单排?我试过到目前为止是:

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

我该如何去按照我想要的方式去做这件事?

谢谢!

回答

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可以更好的服务等我提前

+0

10秒,并用相同的查询稍微整洁版本:/ – 2012-04-26 01:46:02

+0

嘿,你俩打我它 – 2012-04-26 01:52:47

+0

这是伟大的,完美的作品,但我不明白。这里的逻辑是什么?为什么最大限度地说,而不是最小? (PS这张表支持一个系统,用户可以创建任意键,所以有必要让它支持像这样的东西) – Jeremy 2012-04-26 01:57:11