Domanda

Come posso essere sicuro che il mio set di risultati avrà prima a e b ? Mi aiuterebbe a risolvere un difficile problema di ordinazione.

Ecco un esempio semplificato di ciò che sto facendo:

SELECT a FROM A LIMIT 1 
UNION 
SELECT b FROM B LIMIT 1;
È stato utile?

Soluzione

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

Altri suggerimenti

Non credo che l'ordine sia garantito, almeno non in tutti i DBMS.

Quello che ho fatto in passato per controllare l'ordinamento in UNION è:

(SELECT a, 0 AS Foo FROM A LIMIT 1)
UNION
(SELECT b, 1 AS Foo FROM B LIMIT 1)
ORDER BY Foo

Il tuo set di risultati con UNION eliminerà valori distinti.

Non riesco a trovare alcuna prova nella documentazione, ma da 10 anni di esperienza posso dire che UNION ALL conserva l'ordine, almeno in Oracle .

Non fare affidamento su questo, tuttavia, se stai costruendo una centrale nucleare o qualcosa del genere.

No, l'ordine dei risultati in una query SQL è controllato solo dalla clausola ORDER BY. È possibile che ti capiti di vedere risultati ordinati senza una clausola ORDER BY in qualche situazione, ma ciò è per caso (ad esempio un effetto collaterale del piano di query corrente dell'ottimizzatore) e non è garantito.

Qual è il problema con gli ordini?

So che per Oracle non c'è modo di garantire che uscirà per primo senza un ordine di. Il problema è che se lo provi potrebbe venire fuori nell'ordine corretto anche per la maggior parte delle volte che lo esegui. Ma non appena si fa affidamento su di esso nella produzione, verrà fuori sbagliato.

Non avrei pensato di no, dato che molto probabilmente il database avrebbe bisogno di fare un ORDER BY per l'UNIONE.

UNION ALL potrebbe comportarsi diversamente, ma YMMV.

La risposta breve è sì, otterrai A quindi B.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top