2011-08-04 35 views
1

我的表看起來像這樣:SQL:鍵值:列中的值?

+--------------------------+ 
| key | value-name | value | 
+-----+------------+-------+ 
| 1 | color  | green | 
| 1 | height  | 15 | 
| 2 | whatever | lol | 
+-----+------------+-------+ 

,我想這樣它看起來像翻轉它:

+-----+-------+--------+----------+ 
| key | color | height | whatever | 
+-----+-------+--------+----------+ 
| 1 | green | 15  | ---  | 
| 2 | --- | --- | lol  | 
+-----+-------+--------+----------+ 

與像SQL:

SELECT key AS k, 
    (SELECT color FROM table WHERE key = k), 
    (SELECT height FROM table WHERE key = k), ... 

...等等

如何在不爲每個值名稱創建子查詢的情況下完成這些工作(b因爲我相信這不是很快)?

我的DBS是Oracle 10g。

編輯:我後來發現了一些例子,但他們都加入了,我不能這樣做,因爲我的表有很多值名稱。

回答

2
select 
    key 
, max(case value-name when 'color' then value else NULL end)  as color 
, max(case value-name when 'heght' then value else NULL end)  as height 
, max(case value-name when 'whatever' then value else NULL end) as whatever 
from 
    table 
group by key 
+0

您是否需要對查詢進行分組? – Guffa

+0

@Guffa肯定,謝謝你的通知。我編輯了我的答案 – schurik

0

使用條件CASE聲明

CASE column 
WHEN column='a' THEN 'x' 
WHEN column='b' THEN 'y' 
END 
3

你會首先得到的值作爲單獨的列,您可以用case這樣做,那麼你會組的關鍵,讓他們在同一記錄:

select key, max(color), max(height), max(whatever) 
from (
    select 
    key, 
    case when value-name = 'color' then value else null end as color, 
    case when value-name = 'height' then value else null end as height, 
    case when value-name = 'whatever' then value else null end as whatever 
    from table 
) x 
group by key