2012-12-27 7 views
8

Questa è la mia tabella di NEWSPAPER.Come funziona la clausola order by se due valori sono uguali?

National News A 1 
    Sports   D 1 
    Editorials  A 12 
    Business  E 1 
    Weather   C 2 
    Television  B 7 
    Births   F 7 
    Classified  F 8 
    Modern Life  B 1 
    Comics   C 4 
    Movies   B 4 
    Bridge   B 2 
    Obituaries  F 6 
    Doctor Is In F 6 

quando faccio funzionare questa domanda

select feature,section,page from NEWSPAPER 
where section = 'F' 
order by page; 

Dà questa uscita

Doctor Is In F 6 
Obituaries  F 6 
Births   F 7 
Classified  F 8 

Ma in Oracle 10g di riferimento completo di Kevin Loney l'uscita è come questo

Obituaries  F 6 
Doctor Is In F 6 
Births   F 7 
Classified  F 8 

Per favore aiutami a capire d come sta succedendo?

+3

Non sono la stessa uscita? Ad ogni modo, l'ordine per i risultati con lo stesso valore non è definito e probabilmente ritorna in base a come vengono memorizzati sul disco. – mellamokb

+0

L'uscita è la stessa? – Jake1164

+0

Oh scusa non è stato in grado di copiare correttamente l'uscita dal libro. Aggiunto correttamente l'output dal libro. –

risposta

7

Nei database relazionali, i tavoli sono set e non sono ordinati. La clausola order by viene utilizzata principalmente per scopi di output (e alcuni altri casi, ad esempio una sottoquery contenente rownum).

Questo è un buon punto di partenza. Lo standard SQL non specifica cosa deve succedere quando le chiavi su un order by sono uguali. E questo è per una buona ragione. Diverse tecniche possono essere utilizzate per l'ordinamento. Alcuni potrebbero essere stabili (preservando l'ordine originale). Alcuni metodi potrebbero non esserlo.

Concentrarsi sull'esistenza delle stesse righe nei set, non sul loro ordine. A proposito, considererei questo un esempio sfortunato. Il libro non dovrebbe avere specie ambigue nei suoi esempi.

+0

Cosa intendi con "E questo è per una buona ragione"? –

+2

@Abhishekkumar. . . Quello che voglio dire è che lo standard consente ai fornitori di database margine di manovra su come implementare determinate cose, e questa è una buona cosa. –

+0

Per espandere, l'ordine può essere intensivo per l'elaborazione: la non specifica di un ordine predefinito lascia i fornitori liberi di ottimizzare le query che non hanno una clausola ORDER BY come ritengono opportuno. – taswyn

7

Se avete bisogno di affidabile, riproducibile ordinamento che si verificano quando due valori nella prima colonna del vostro clausola ORDER BY sono gli stessi, si dovrebbe sempre fornire un altro, la colonna secondaria di ordinare anche on. Mentre potresti essere in grado di supporre che si ordineranno in base all'ordine inserito (quasi sempre a mia conoscenza, ma sii consapevole che lo standard SQL non specifica alcuna forma di ordinamento predefinito) o indice, non dovresti mai (a meno che non è specificamente documentato come tale per il motore che stai usando - e anche allora personalmente non mi fiderei mai di quello).

la tua ricerca, se si voleva ordinamento alfabetico per funzione all'interno di ogni pagina, dovrebbe essere:

select feature,section,page from NEWSPAPER 
where section = 'F' 
order by page, feature;
+0

@ taswyn- questo è esattamente il prossimo esempio dice. Ma mi stavo chiedendo perché ho avuto un risultato diverso rispetto al libro? Volevo sapere se c'è un modo predefinito per gestire. –

+0

Anche se si considera l'ordine inserito da un ordine predefinito, è necessario fare affidamento sulla propria logica programmata piuttosto che prendere una scorciatoia che potrebbe causare situazioni che non si erano previste. Lo standard SQL non specifica l'ordinamento predefinito. A mia conoscenza, Oracle non documenta un ordinamento predefinito, il che significa che qualsiasi cosa su cui si basa perché sembra che i risultati riproducibili ora potrebbero cambiare. Qualsiasi risultato che vuoi vedere in modo affidabile dovrebbe sempre essere rappresentato dalla logica del tuo programma. Non fare supposizioni su qualcosa che non sia specificamente definito dai tuoi strumenti o dal tuo codice. – taswyn

+0

avete qualche idea su quale colonna otterrà maggiore preferenza mentre ordinate il set di risultati.Sto lavorando su alcune classifiche basate su una colonna che memorizza i punteggi, ma il problema è che più file hanno gli stessi valori di punteggio e quando li prelevo vengono in ordine casuale. se userò la chiave primaria di tipo int come secondo argomento di ordinamento mi darà sempre risultato nello stesso ordine. – sumit