2012-12-27 30 views
8

這是我的NEWSPAPER表。如果兩個值相等,order by子句如何工作?

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 

當我運行此查詢

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

它給出了這樣的輸出

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

但凱文Loney的Oracle 10g的完全參考的輸出是這樣的

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

請幫我解決ð它是如何發生的?

+3

它們不是相同的輸出嗎?無論如何,具有相同值的結果的順序是未定義的,並且可能基於它們在磁盤上的存儲方式返回。 – mellamokb

+0

輸出是一樣的嗎? – Jake1164

+0

哦,抱歉無法正確複製書本的輸出。正確添加了書中的輸出。 –

回答

7

在關係數據庫中,表是集和是無序的。 order by子句主要用於輸出目的(以及一些其他情況,例如包含rownum的子查詢)。

這是一個很好的開始。 SQL標準沒有指定當order by上的密鑰相同時必須發生的事情。這是有原因的。不同的技術可以用於分類。有些可能是穩定的(保留原始順序)。有些方法可能不是。

關注相同的行是否在集合中,而不是它們的排序。順便說一下,我認爲這是一個不幸的例子。這本書在其例子中不應該含糊不清。

+0

你是什麼意思「這是有道理的」? –

+2

@Abhishekkumar。 。 。我的意思是這個標準允許數據庫供應商在如何實現某些事情上留有餘地,這是一件好事。 –

+0

要擴展,排序可以是處理密集型的:不指定默認排序可讓供應商免費優化沒有ORDER BY子句的查詢,但他們認爲合適。 – taswyn

7

如果您需要可靠,重複性時,按照您的ORDER BY子句的第一列兩個值是相同的發生,你應該總是提供另一個次級柱也訂上。儘管你可能會假設他們會根據輸入的順序對自己進行排序(幾乎總是這樣,但據我所知,但請注意,SQL標準沒有指定任何形式的默認排序)或索引,但您絕不應該(除非它是專門爲你所使用的引擎記錄的 - 即使如此,我個人從來不會依賴於此)。

你的查詢,如果你每個頁面中希望字母排序的功能,應該是:

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

@ taswyn-這就是下一個例子所說的。但是我想知道爲什麼我得到與本書相比不同的輸出?想知道是否有任何默認的方式來處理。 –

+0

即使您認爲輸入的順序是默認排序,您也應該依賴自己編程的邏輯,而不是採用可能會導致您未曾注意的情況的快捷方式。 SQL標準沒有指定默認排序。就我所知,Oracle沒有記錄默認排序,這意味着您依賴的任何東西,因爲您似乎現在可以獲得可重複的結果。您想要可靠地查看的任何結果應始終由您的程序邏輯表示。不要對你的工具或你的代碼沒有明確定義的東西做出假設。 – taswyn

+0

你是否知道在排序結果集時哪一列會得到較高的優先級。我正在研究基於存儲分數的列的一些排名的東西,但問題是多行得到相同的分數值,並且當我獲取它們時,它們以隨機順序來進行。如果我將使用int類型的主鍵作爲第二個排序參數,它總是會以相同的順序給出結果。 – sumit