2012-12-27 12 views
8

To jest moja tabela NEWSPAPER.Jak działa polecenie order by, jeśli dwie wartości są równe?

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 

Kiedy uruchomić tę kwerendę

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

Daje to wyjście

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

Ale Kevin Loney w Oracle 10g kompletna lista wyjście jest tak

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

Pomóż mi zrozumieć d jak to się dzieje?

+3

Czy nie są one takie same? W każdym razie kolejność wyników o tej samej wartości jest niezdefiniowana i prawdopodobnie wraca w zależności od tego, jak zostaną zapisane na dysku. – mellamokb

+0

Dane wyjściowe są takie same? – Jake1164

+0

Niestety, nie udało się poprawnie skopiować danych wyjściowych z książki. Dodano dane wyjściowe z książki poprawnie. –

Odpowiedz

7

w relacyjnych bazach danych, tabele są zestawy i są nieuporządkowane. Klauzula order by jest używana przede wszystkim do celów wyjściowych (i kilku innych przypadkach, takich jak podkwerenda zawierająca rownum).

To jest dobre miejsce na rozpoczęcie. Standard SQL nie określa, co ma się stać, gdy klucze na urządzeniu order by są takie same. I nie bez powodu. Do sortowania można zastosować różne techniki. Niektóre mogą być stabilne (zachowując oryginalną kolejność). Niektóre metody mogą nie być.

Skoncentruj się na tym, czy w zestawach znajdują się te same wiersze, a nie ich kolejność. Przy okazji uważam to za niefortunny przykład. Książka nie powinna mieć niejednoznacznych rodzajów w swoich przykładach.

+0

Co masz na myśli przez "A to nie bez powodu"? –

+2

@ Abhishekkumar. . . Chodzi mi o to, że standard pozwala sprzedawcom baz danych na swobodne wdrażanie pewnych rzeczy, a to dobrze. –

+0

Aby się rozwinąć, zamawianie może wymagać dużego nakładu pracy: brak określenia domyślnego zamawiania umożliwia dostawcom bezpłatne optymalizowanie zapytań, które nie mają klauzuli ORDER BY, ale uznają to za stosowne. – taswyn

7

Jeśli potrzebujesz niezawodne, powtarzalne zamawiania występuje, gdy dwie wartości w pierwszej kolumnie Twojego ORDER BY klauzula są takie same, zawsze należy zapewnić inny, kolumna wtórny również zamówić na. Chociaż możesz być w stanie założyć, że będą sortować się na podstawie wprowadzonego zamówienia (prawie zawsze zgodnie z moją wiedzą, ale pamiętaj, że standard SQL nie określa żadnej formy domyślnego uporządkowania) lub indeksu, nigdy nie powinieneś (chyba że jest specjalnie udokumentowany w odniesieniu do silnika, z którego korzystasz - i nawet wtedy osobiście nigdy na tym nie polegałbym).

zapytanie, czy chcesz alfabetycznego sortowania według funkcji w obrębie każdej stronie, powinno być:

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

@ taswyn - dokładnie tak mówi następny przykład. Ale zastanawiałem się, dlaczego mam inne wyniki w porównaniu do książki? Chciał wiedzieć, czy istnieje jakiś domyślny sposób obsługi. –

+0

Nawet jeśli uważałeś, że zlecenie wprowadzone jako domyślna kolejność, powinieneś polegać na własnej zaprogramowanej logice zamiast na skrócie, co może skutkować sytuacjami, których nie przewidziałeś. Standard SQL nie określa kolejności domyślnej. O ile mi wiadomo, Oracle nie udokumentuje domyślnego zamówienia, co oznacza, że ​​wszystko, na czym polegasz, ponieważ wydajesz się odtwarzać wyniki, teraz może się zmienić. Wszelkie wyniki, które chcesz widzieć niezawodnie, powinny zawsze być reprezentowane przez logikę programu. Nie twórz założeń dotyczących niczego, co nie zostało zdefiniowane przez twoje narzędzia lub kod. – taswyn

+0

Czy masz pojęcie, która kolumna uzyska wyższą preferencję podczas zamawiania zestawu wyników.Pracuję nad niektórymi pozycjami rankingowymi opartymi na kolumnie, która przechowuje wyniki, ale problem polega na tym, że wiele wierszy ma takie same wartości punktacji, a po ich pobraniu przychodzą w losowej kolejności. jeśli użyję klucza podstawowego typu int jako drugiego argumentu sortującego, zawsze da mi wynik w tej samej kolejności. – sumit