2009-03-27 9 views
6

L'inclusione di DISTINCT in una query SELECT implica che il set risultante debba essere ordinato?SELECT DISTINCT implica una sorta di risultati

Non credo di sì, ma sto cercando una risposta autorevole (collegamento web).

Ho una query come questa:

Select Distinct foo 
From Bar 

in Oracle, i risultati sono distinti, ma non sono in modo ordinato. In Jet/MS-Access sembra esserci un ulteriore lavoro da fare per assicurare che i risultati siano ordinati. Suppongo che Oracle stia seguendo le specifiche in questo caso e MS Access va oltre.

Inoltre, c'è un modo per dare al tavolo un suggerimento che dovrebbe essere selezionato su foo (se non diversamente specificato)?

risposta

4

Dal SQL92 specification:

Se è specificato DISTINCT, poi lasciate TXA essere il risultato di eliminare i valori duplicati ridondanti da TX. Altrimenti, lascia TXA essere TX.

...

4) Se non viene specificato un, l'ordinamento delle righe di Q dipende dall'implementazione.

In definitiva la vera risposta è che DISTINCT e ORDER BY sono due parti separate dell'istruzione SQL; Se non si dispone di una clausola ORDER BY, i risultati per definizione non saranno ordinati in modo specifico.

1

No, non è un ordinamento. Secondo la mia esperienza, si basa sull'indice conosciuto, che può capitare di essere foo.

Perché essere sottile? Perché non specifico Seleziona Distinti foo da Ordine Bar per pippo?

+0

E perché non è questo l'ordine che si desidera? – dkretz

+0

Nel suo post "ordinamento su foo (se non diversamente specificato)" sto chiedendo perché non specificare foo se non diversamente specificato – jerebear

+0

Perché essere sottile e suggerimento? Non voglio dover ricompilare e ridistribuire a questo punto. Se potessi dare un suggerimento a oracle, risolverebbe il mio problema e potrei inserire la correzione esplicita in un momento più conveniente. –

1

Non a mia conoscenza, no. L'unica ragione per cui posso pensare è che SQL Server ordina internamente i dati per rilevare e filtrare i duplicati e quindi restituirli in modo "pre-ordinato". Ma non farei affidamento su questo "effetto collaterale" :-)

0

Su almeno un server che ho usato (probabilmente Oracle o SQL Server, circa sei anni fa), SELECT DISTINCT è stato rifiutato se non l'hai fatto t avere una clausola ORDER BY. È stato accettato sul server "altro" (Oracle o SQL Server). Il tuo chilometraggio può variare.

3

Non c'è un "autorevole" collegamento risposta, dal momento che questo è qualcosa che nessun server SQL garanzie.

Vedrete spesso i risultati in ordine quando si usa distinto come effetto collaterale dei migliori metodi per trovare quei risultati. Tuttavia, un numero qualsiasi di altre cose può confondere i risultati e alcuni server possono restituire risultati in modo tale da non fornirli ordinati anche se dovesse essere ordinato per ottenere i risultati.

Bottom line: se il vostro server non garantisce qualcosa, non dovreste contare su di esso.

-1

Sì. Oracle usa una sorta per calcolare una distinta. Lo puoi vedere se guardi il piano di spiegazioni. Il fatto che abbia funzionato per quel calcolo non implica in alcun modo che il set di risultati verrà ordinato. Se si desidera ordinare il set di risultati, è necessario utilizzare la clausola ORDER BY.

+0

Oracle 10 e 11 utilizzano l'hashing per calcolare un distinto, non un ordinamento. – tuinstoel

+0

Oracle 10 e 11 * may * utilizzano l'hashing. –

+0

Posso credere. Ho osservato la specie nel piano in risposta a un distinto. Sono bloccato su 9i e 10g. – EvilTeach

5

No. Esiste un numero di circostanze in cui un DISTINCT in Oracle non implica un ordinamento, il più importante dei quali è l'algoritmo di hash utilizzato in 10g + per operazioni di gruppo e distinte.

Sempre specificare ORDER BY se si desidera un set di risultati ordinato, anche in 9i e sotto.

+0

Non penso che risponda alla domanda. Ovviamente devi specificare entrambi se vuoi entrambi. Ma è un tipo eseguito in base al DISTINCT indipendentemente dal tipo richiesto (o da nessun tipo)? – dkretz

+0

D: "L'inclusione di DISTINCT in una query SELECT implica che l'insieme risultante debba essere ordinato?" A: "Ci sono un certo numero di circostanze in cui un DISTINCT in Oracle non implica un ordinamento" Prima di 10g un set di risultati DISTINCT ** di solito ** è stato ordinato, ma non sempre. –

0

Come le risposte per lo più dicono, DISTINCT non impone un ordinamento - solo ORDINE BY lo richiede. Tuttavia, un modo standard per ottenere risultati DISTINCT è quello di ordinare; l'altro consiste nell'hash i valori (che tendono a condurre al sequenziamento semi-casuale). Affidarsi all'effetto sort di DISTINCT sarebbe sciocco.

1

Nel mio caso (server SQL), ad esempio, avevo un elenco di paesi con un valore numerico X assegnato a ciascuno. Quando ho fatto un select distinto * da Table order per X, l'ho ordinato da X, ma allo stesso tempo sono stati ordinati anche i set di risultati che non sono stati implementati direttamente. Dalla mia esperienza, dirò che distinto implica un tipo implicito.

+0

Puoi aggiungere un esempio di codice (o scomporre quello che sembra essere il tuo esempio di codice in un paragrafo separato)? –

+0

@Jess Bowers: Di seguito è riportato il frammento: Solo per citare che sia ABC e #result sono chiamati tabelle temporanee in una stored procedure: 'Inserire nella #Result \t selezionare top distinti (10) * rom ABC X \t ordine da XY asc selezionare * da # Risultato' –