Oracle 11g - 将列拆分为行

时间:2014-09-29 07:11:13

标签: sql oracle11g

我有sql结果,看起来像这样

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;

目前我使用UNIONS但这个查询的成本很高(每个查询都需要从表中选择ID为string类型的数据,进行一些连接和过滤数据)。我想尝试仅使用字符串id查询主表一次。

2 个答案:

答案 0 :(得分:2)

您可以将您的选择查询放入WITH子句并取消忽略此数据。

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'));

答案 1 :(得分: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