2012-04-26 33 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