2017-01-13 2 views
1

J'ai une table dans le format ci-dessous:Utilisez Pivot fonction pour fusionner des ensembles de colonnes dans Oracle

id colA1 colB1 colA2 colB2 
1 100 499 500 999 

J'ai besoin dans le format ci-dessous,

id colA colB 
1 100 499 
1 500 999 

J'ai essayé en utilisant la méthode unpivot, mais il donne comme ci-dessous,

colA colB 
    100 499 
    100 999 
    500 499 
    500 999 

requête utilisée

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

J'étais capable de le faire en utilisant union, mais je veux qu'il soit mis en œuvre en utilisant la méthode unpivot. –

+1

... et pour une bonne raison: je crois que UNION ALL signifiera que la table de base est lue deux fois, tandis que UNPIVOT la lit une seule fois. – mathguy

+0

@mathguy Unpivot a une meilleure performance lors de l'exécution. –

Répondre

2

Vous pouvez le faire en utilisant un seul UNPIVOT comme ceci:

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

Il suffit de faire un UNION ALL, sélectionnez d'abord avec A1 et B1, deuxième sélectionnez avec A2 et 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

C'était aussi ma première réaction. Cependant, cette solution lit deux fois la table de base; Je crois que UNPIVOT le lit une seule fois, et si c'est le cas, il devrait être plus efficace. – mathguy

+0

@mathguy, peut-être avez-vous raison, je ne connais pas très bien Oracle. Cependant, je m'attendrais à ce qu'une simple sélection (ou deux) sans aucune condition ou commande soit très rapide, puisque c'est juste une question de transfert de données. – jarlh

+0

"Très rapide" dépend de nombreux facteurs. Par exemple, que se passe-t-il si la récupération de données se fait sur un réseau lent? Spéculation pure; mais c'est pourquoi chaque fois que nous pouvons lire une table de base seulement une fois contre deux fois, c'est préférable. (Ne pas frapper votre solution - après tout, comme je l'ai dit, c'était aussi ma première réaction!) – mathguy