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;
Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top