2014-09-29 68 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'));