2014-09-29 6 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 имеет типа строки, сделать некоторые соединения и фильтрации данных). Я хочу попытаться запросить основную таблицу с идентификатором строки только один раз.

ответ

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

См. Мое редактирование. В настоящее время я использую UNIONS, но стоимость этого слишком велика. – pepuch

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')); 
Смежные вопросы