2017-01-13 14 views
1

У меня есть таблица в указанном ниже формате:Использование Pivot Функция слияния множества столбцов в Oracle

id colA1 colB1 colA2 colB2 
1 100 499 500 999 

Мне нужно это в приведенном ниже формате,

id colA colB 
1 100 499 
1 500 999 

Я попытался с помощью unpivot метод, но это дает, как показано ниже,

colA colB 
    100 499 
    100 999 
    500 499 
    500 999 

запросов используется

select * from (select colA, colB from my_table 
unpivot 
(colA for ColNm1 in(
colA1, 
colA2 
)) 
unpivot 
(colB for ColNm2 in(
colB1, 
colB2 
)); 
+0

Я в состоянии сделать это с помощью union, но я хочу, чтобы он был реализован с помощью метода univot. –

+1

... и не зря: я считаю, что UNION ALL будет означать, что базовая таблица читается дважды, а UNPIVOT читает ее только один раз. – mathguy

+0

@mathguy Unpivot имеет лучшую производительность при выполнении. –

ответ

2

Вы можете сделать это с помощью одного UNPIVOT так:

WITH my_table AS (SELECT 1 ID, 100 cola1, 499 colb1, 500 cola2, 999 colb2 FROM dual UNION ALL 
        SELECT 2 ID, 85 cola1, 163 colb1, 29 cola2, 457 colb2 FROM dual) 
select ID, 
     cola, 
     colb 
from my_table 
UNPIVOT ((cola, colb) FOR def_col IN ((cola1, colb1), (cola2, colb2))); 

     ID  COLA  COLB 
---------- ---------- ---------- 
     1  100  499 
     1  500  999 
     2   85  163 
     2   29  457 
1

Просто сделать UNION ALL, сначала выберите с A1 и B1, второй выбор с A2 и B2:

select id, colA1 as colA, colB1 as colB 
from my_table 
UNION ALL 
select id, colA2 as colA, colB2 as colB 
from my_table 
+0

Это была моя первая реакция. Однако это решение дважды читает базовую таблицу; Я считаю, что UNPIVOT читает его только один раз, и если да, то он должен быть более эффективным. – mathguy

+0

@mathguy, может быть, вы правы, я не очень хорошо разбираюсь в Oracle. Однако я ожидал бы простого выбора (или двух) без каких-либо условий или порядка, чтобы быть очень быстрым, поскольку это всего лишь вопрос передачи данных. – jarlh

+0

«Очень быстро» зависит от многих факторов. Например, что делать, если выборка данных происходит по медленной сети? Чистая спекуляция; но именно поэтому, когда мы можем читать базовую таблицу только раз в два раза, это предпочтительнее. (Не сбивая с толку ваше решение - ведь, как я уже сказал, это была моя первая реакция!) – mathguy

 Смежные вопросы

  • Нет связанных вопросов^_^