Comment puis-je commander des entrées dans UNION sans ORDER BY?
-
03-07-2019 - |
Question
Comment puis-je être sûr que mon jeu de résultats aura a
en premier et b
en second? Cela me permettrait de résoudre un problème de commande délicat.
Voici un exemple simplifié de ce que je fais:
SELECT a FROM A LIMIT 1
UNION
SELECT b FROM B LIMIT 1;
La solution
SELECT col
FROM
(
SELECT a col, 0 ordinal FROM A LIMIT 1
UNION ALL
SELECT b, 1 FROM B LIMIT 1
) t
ORDER BY ordinal
Autres conseils
Je ne pense pas que l'ordre soit garanti, du moins pas dans tous les SGBD.
Ce que j'ai fait par le passé pour contrôler l'ordre dans UNION est:
(SELECT a, 0 AS Foo FROM A LIMIT 1)
UNION
(SELECT b, 1 AS Foo FROM B LIMIT 1)
ORDER BY Foo
Votre jeu de résultats avec UNION
éliminera les valeurs distinctes.
Je ne trouve aucune preuve dans la documentation, mais après 10
années d'expérience, je peux dire que UNION ALL
conserve l'ordre, au moins dans Oracle
.
Ne vous fiez pas à cela, cependant, si vous construisez une centrale nucléaire ou quelque chose du genre.
Non, l'ordre des résultats dans une requête SQL est contrôlé uniquement par la clause ORDER BY. Il se peut que vous voyiez des résultats ordonnés sans clause ORDER BY dans certaines situations, mais c'est par hasard (par exemple, un effet secondaire du plan de requête actuel de l'optimiseur) et non garanti.
Quel est le problème de commande délicat?
Je sais que pour Oracle, il n’ya aucun moyen de garantir qui sortira le premier sans ordre. Le problème est que si vous l'essayez, il peut apparaître dans le bon ordre même si vous l'exécutez la plupart du temps. Mais dès que vous en aurez besoin dans la production, les résultats seront mauvais.
J'aurais pensé que non, car la base de données aurait très probablement besoin de faire un ORDER BY pour pouvoir accéder à UNION.
UNION ALL peut se comporter différemment, mais YMMV.
La réponse courte est oui, vous obtiendrez A puis B.