2010-10-11 14 views
7

Oracle'da sorgu gibi rastgele bir sırayla dönen bir sorgu tarafından şaşkın.Oracle, 'orderby' değerleri aynıysa neden belirli bir sıralama döndürüyor?

SELECT 
    Date, 
    Amount 
FROM MyTable 
WHERE Date = '26-OCT-2010' 
ORDER BY Date 

Bu aşağıdaki verileri döndürür:

| Date  | Amount 
-------------------------- 
1 | 26-OCT-10 | 85 
2 | 26-OCT-10 | 9 
3 | 26-OCT-10 | 100 

veritabanı bu belirli bir düzen içinde veri döndürür veya neden anlayamaz neden orijinal tablo bu şekilde veri döneceğini beri. Dolayısıyla, ben değerlerde bir fark olduğunu ekarte edebilir, 26-OCT-10 00.00.00.000000000 - TIMESTAMP için Date Döküm

tüm Date değerleri aynı değeri olduğunu doğrulamaktadır. Ancak, bunu yaptığımda, satırlar 1, 3, 2 sırasına göre döner.

Bu beni kızdırıyor, bu yüzden birileri bunun neden olduğu konusunda bir açıklama yapabilirse beni rahatlatmaya yardımcı olur.

bu koşullu emir (böylece saf şansa sipariş bırakarak) her satırda aynı olduğu göz önüne alındığında, farklı bir sırada sorgu her çalıştırıldığında dönmek için beklenebilir.

Şimdiden çok teşekkürler. Oracle bir stable sıralama yapmak için sıralama algoritması kullanır gibi

cevap

10

sipariş aşağı "saf şans" için değil - sorguyu değişiklik olmadıkça:

SELECT 
    Date, 
    Amount 
FROM MyTable 
WHERE Date = '26-OCT-2010' 
ORDER BY Date, DBMS_RANDOM.VALUE; 

sipariş "keyfi" dir. kısa vadede çalışma çalışma aynı olması muhtemeldir - Aksine (bazı gereksiz maliyet tabi olacaktır) keyfi sırasını belirlemek için "zar atmak" yerine, Oracle sadece onu karşılaştı sırayla verileri döndürür. (Uzun vadede, siparişi farklı kılmak için çevrede bir şey değişebilir - ama yine de keyfi).

+0

Açıklama için teşekkür ederiz! SQL Server gibi karşılaşılan sıraya yalnızca 'geri dönebileceğini' düşündüm ama emin değildim. Tekrar teşekkürler! –

-1

geliyor.

+0

bağlantı için teşekkür ederiz! –

+2

Alıntı gerekli. Oracle Docs, sonuçların iki aynı değeri sıralarken tanımlandığını belirtmez. http://download.oracle.com/docs/cd/E11882_01/server.112/e17118/statements_10002.htm # SQLRF01702 –

+1

Jeffrey doğru: sipariş istikrarlı görünebilir, ancak gerçekte siparişin değişmesi oldukça olasıdır - örneğin tabloya bir indeks eklendiyse. –

2

Oracle'ın uygulanmasıyla ilgili hiçbir şey bilmese de, eğer her şey eşitse, öncelikliyse, onlar Rastgele bir düzende olmayacaklar: onları rastgele bir sıraya koymak, her seferinde orada rastgele bir sıralama gerektirir (n sorgu sonuçlarının iri (milyon) dönecekti eğer bir hesaplama pahalı bir şeydir, (o nO() olacağını büyük Ç gösterimi kullanılarak) öğelerin sayısı n randomising işlemleri, olurdu.

sadece

onları bu şekilde randomize edilecek gerek yoktur

,.

yerine sorgusunun döndürdüğü Sipariş onlar sipariş ile ilgili olarak Tom Kyte'ın blogdan diskin

2

Oku this nice piece saklanır (ne olduğunu tahmin ediyorum) onları döndürür.

Eğer satırlar o zaman bunu düzeltmek için 1,3,2 sırayla olduğunu anlatmaya sütuna (ler) tarafından sipariş etmelidir "1,3,2" sırayla gel dediğimde.

İlgili konular