2014-09-29 84 views
-1

我有SQL結果看起來像這樣的Oracle 11g - 拆分成列行

ID | ERROR_1 | ERROR_2 
1 | '1'  | '2'  
2 | null | '2'  
3 | '1'  | '2'  
4 | '1'  | null  

,我想分裂每個ERROR_X行導致這樣的:

ID | ERROR 
1 | '1' 
1 | '2' 
2 | '2' 
3 | '1' 
3 | '2' 
4 | '1' 

這可能嗎?如果是,我該怎麼辦?

查詢與此類似:

SELECT h.id as ID, 
CASE WHEN h.floor=1 THEN '1' END as ERROR_1, 
CASE WHEN w.color='blue' THEN '2' END as ERROR_2, 
FROM home h 
LEFT JOIN window w ON w.id=h.window_id; 

目前我使用工會,但此查詢的成本是巨大的(每個查詢需要從表其中ID爲字符串類型選擇數據,做一些連接和過濾數據)。我想嘗試只用一次字符串ID查詢主表。

回答

0

好像你需要使用union all

SELECT id, CASE WHEN floor=1 THEN '1' END AS error 
FROM home 
UNION ALL 
SELECT window.id, CASE WHEN window.color='blue' THEN '2' END 
FROM window 
JOIN home ON window.id = home.window_id 
+0

查看我的編輯。目前我使用UNION,但是這個代價太大了。 – pepuch 2014-09-29 07:16:32

2

你可以把你的選擇查詢與子句和UNPIVOT這一數據。

WITH VDATA AS (
    SELECT 
    h.id as ID, 
    CASE WHEN h.floor=1 THEN '1' END as ERROR_1, 
    CASE WHEN w.color='blue' THEN '2' END as ERROR_2 
FROM home h 
LEFT JOIN window w ON w.id=h.window_id 
) SELECT 
    ID, 
    ERROR 
    FROM VDATA 
    UNPIVOT (error for errorid in (ERROR_1 as '1', ERROR_2 as '2'));