UNION ALL garantisce l’ordine del set di risultati

Posso essere sicuro che il set di risultati del seguente script sarà sempre ordinato come questo?

SELECT 'O' UNION ALL SELECT 'R' UNION ALL SELECT 'D' UNION ALL SELECT 'E' UNION ALL SELECT 'R' 

Può essere provato a volte essere in un ordine diverso?

Non esiste un ordine inerente, devi usare ORDER BY . Per il tuo esempio puoi farlo facilmente aggiungendo un SortOrder a ogni SELECT. Ciò manterrà quindi i record nell’ordine desiderato:

 SELECT 'O', 1 SortOrder UNION ALL SELECT 'R', 2 UNION ALL SELECT 'D', 3 UNION ALL SELECT 'E', 4 UNION ALL SELECT 'R', 5 ORDER BY SortOrder 

Non puoi garantire l’ordine a meno che tu non specifichi specificamente un ordine con la query.

No non lo fa. Le tabelle SQL sono intrinsecamente non ordinate. È necessario utilizzare l’ order by per ottenere le cose nell’ordine desiderato.

Il problema non è se funziona una volta quando lo provi. Il problema è se puoi fidarti di questo comportamento. E tu non puoi SQL Server non garantisce nemmeno l’ordine per questo:

 select * from (select t.* from t order by col1 ) t 

Dice qui :

Quando ORDER BY viene utilizzato nella definizione di una vista, funzione inline, tabella derivata o sottoquery, la clausola viene utilizzata solo per determinare le righe restituite dalla clausola TOP. La clausola ORDER BY non garantisce i risultati ordinati quando questi costrutti vengono interrogati, a meno che ORDER BY non sia specificato anche nella query stessa.

Un principio fondamentale del linguaggio SQL è che le tabelle non sono ordinate. Pertanto, sebbene la query possa funzionare in molti database, è necessario utilizzare la versione suggerita da BlueFeet per garantire l’ordine dei risultati.

Prova ad eliminare tutti i messaggi di testo, ad esempio. O anche solo uno di loro. Ora considera che il tipo di ottimizzazione che deve avvenire lì (e molti altri tipi) sarà anche ansible quando le query SELECT sono query effettive rispetto alle tabelle e sono ottimizzate separatamente. Senza un ordine, l’ordine all’interno di ogni query sarà arbitrario e non è ansible garantire che le query stesse verranno elaborate in qualsiasi ordine.

Dire UNION ALL senza ORDER BY è come dire “Basta lanciare tutte le biglie sul pavimento”. Forse ogni volta che lanci tutte le biglie sul pavimento, finiscono per essere organizzate per colore. Ciò non significa che la prossima volta che li getti sul pavimento si comporteranno allo stesso modo. Lo stesso vale per l’ordine in SQL Server: se non si specifica ORDER BY SQL Server assume che non si preoccupi dell’ordine. Si può notare per coincidenza che un determinato ordine viene sempre restituito, ma molte cose possono influenzare l’ordine arbitrario che è stato selezionato la volta successiva . Cambiamenti di dati, modifiche delle statistiche, ricompilazione, plan flush, upgrade, service pack, hotfix, flag di traccia … fino alla nausea.

Lo metto a grandi lettere per chiarire:

Non è ansible garantire un ordine senza ORDER BY

Qualche ulteriore lettura:

http://sqlblog.com/blogs/aaron_bertrand/archive/2010/02/08/bad-habits-to-kick-relying-on-undocumented-behavior.aspx

Inoltre, per favore leggi questo post di Conor Cunningham, un ragazzo piuttosto intelligente del team SQL .

No. Ottieni i record in qualsiasi modo in cui SQL Server li preleva per te. È ansible applicare un ordine su un risultato unione impostato dall’indice basato su 1:

 SELECT 1, 'O' UNION ALL SELECT 2, 'R' UNION ALL SELECT 3, 'D' UNION ALL SELECT 4, 'E' UNION ALL SELECT 5, 'R' ORDER BY 1