Je dois ajouter la troisième colonne à la première colonne (mon souhait est que la première colonne inclue également la troisième colonne)
État actuel:
Résultats souhaités:
4 Réponses :
Vous voulez UNION ALL
:
SELECT t.entity, t.activity FROM table t UNION ALL SELECT t.entity2, t.activity2 FROM table t;
select entity, activity from <table> union all select entity_2, activity_2 from <table>
Si vous avez beaucoup de données, vous ne voudrez peut-être pas analyser la table plusieurs fois - ce que fait union all
.
À la place:
select t.entity, s.activity from t cross join lateral (select t.entity, t.activity from dual union all select t.entity_2, t.activity_2 from dual ) s;
Dans Oracle 12C +, cela est simplifié à l'aide de jointures latérales:
select (case when n.n = 1 then entity when n.n = 2 then entity_2 end) as entity, (case when n.n = 1 then activity when n.n = 2 then activity_2 end) as activity from t cross join (select 1 as n from dual union all select 2 as n from dual ) n;
La curiosité a tué le chat; J'ai créé une table avec 40018 lignes et la réponse union all
a pris 1,52 seconde, 579 obtentions cohérentes, votre premier exemple de jointure croisée
a fait un MERGE JOIN CARTESIAN mais n'a pris que 1,13 seconde et 99 obtentions, et la jointure croisée latérale
a fait une vue en ligne, 1,41 seconde, 480 obtentions!
@MarkStewart. . . Wow! Intéressant. Oracle n'a pas fait du bon travail en implémentant des jointures latérales.
en général:
select col1,col2 from table1 union all select col3,col4 form table1;
Je vous conseillerais d'inclure tout code que vous avez essayé dans votre question. Vous augmenterez les chances de recevoir de l'aide et réduirez les chances que votre question soit signalée et supprimée.