1
votes

Comment fusionner deux colonnes de résultats dans une colonne avec des résultats alternés dans oracle?

Pour un tableau avec les colonnes A et B, sélectionnez * dans le tableau rendra

A B
A1 B1
A2 B2
A3 B3

Existe-t-il un moyen d'interroger sur ceci afin que l'ensemble de résultats soit comme ceci -

Fusionné
A1
B1
A2
B2
A3
B3

Appréciez toutes les suggestions :)


0 commentaires

4 Réponses :


2
votes

Une union avec un peu de piquant supplémentaire pour déterminer la commande fonctionnerait:

SELECT col
FROM (
  SELECT 'A' as colname, row_number() OVER (ORDER BY A) as colrow, A as col FROM table
  UNION ALL
  SELECT 'B' as colname, row_number() OVER (ORDER BY B) as colrow, B as col FROM table
) sub
ORDER BY colrow, colname


1 commentaires

Parfait! Non autorisé à marquer accepté pendant 8 minutes supplémentaires, mais oui, l'ordre n'a d'importance que dans le tuple. Merci



1
votes

Jointure gauche simple et casse quand le fera:

SELECT CASE WHEN T1.A = LEAD(T1.A) OVER (ORDER BY T1.A)  THEN T1.A
            ELSE T1.B
       END Merged
FROM MYTABLE T1
LEFT JOIN MYTABLE T2 ON T1.A <> T2.A;

Voici une démo

Result

 entrez la description de l'image ici


0 commentaires

1
votes

Essayez ceci:

SELECT a, rownum*2 as r FROM table
UNION ALL
SELECT b, (rownum*2)+1 FROM table
ORDER BY r

Vous devrez peut-être les transformer en sous-requêtes et les classer par a / b - il n'était pas vraiment clair si vos données d'exemple étaient triées ou si vous êtes satisfait pour avoir juste l'ordre naturel tant qu'ils sont entrelacés


4 commentaires

Vous en manquez un dans la clause. Aussi, comment supprimer r de l'ensemble de résultats? Et comment le commander pour être | A1 | B1 | ...? Merci pour votre réponse. Acclamations!


Supprimez R en enveloppant le tout dans une autre sélection et en ne le sélectionnant pas. Ce n'est généralement pas trop important de le faire, car vous pouvez garder la requête épurée et simplement ne pas utiliser la colonne R dans (par exemple) le frontal


Je n'ai pas mis de tri sur A1 B1 car ce n'était pas nécessairement le cas que ce soit de vraies données (cela ressemble à de fausses données). S'il s'agit de données réelles et qu'elles doivent trier de cette façon, alors le tri des requêtes avant qu'elles ne soient réunies sera acceptable (le rownum sera alors généré dans cet ordre)


Merci pour les commentaires, je voulais juste pointer vers la sortie de l'opération souhaitée mais le commentaire est utile, je crois.



2
votes

J'écrirais ceci comme suit:

select merged
from ((select a as merged, a as ordcol, 1 as which from t
      ) union all
      (select b, a, 2 from t
      )
     ) t
order by ordcol, which;

Les fonctions de fenêtre ne sont pas nécessaires pour cela.


0 commentaires