2015-10-19 80 views
0

我有以下查詢,基於兩個值SQL命令通過選擇頂部執行順序

返回記錄的間隔
SELECT TOP 3 
    a.* 
FROM 
    (SELECT TOP 5 
     ID, Name, CountryCode 
    FROM city 
    ORDER BY ID) a 
ORDER BY 
    ID desc 

結果:

ID Name        CountryCode 
5 Amsterdam       NLD 
4 Mazar-e-Sharif      AFG 
3 Herat        AFG 

這是從城市表的日期:

ID Name       CountryCode 
1 Kabul        AFG 
2 Qandahar       AFG 
3 Herat        AFG 
4 Mazar-e-Sharif      AFG 
5 Amsterdam       NLD 
6 Rotterdam       NLD 
7 Haag        NLD 
8 Utrecht        NLD 
9 Eindhoven       NLD 
10 Tilburg        NLD 
11 Groningen       NLD 
. .         . 
. .         . 
4076 Hebron       PSE 
4077 Jabaliya      PSE 
4078 Nablus       PSE 
4079 Rafah       PSE 

但是,當我從子查詢中刪除命令時,我得到了不同的結果:

SELECT TOP 3 
    a.* 
FROM 
    (SELECT TOP 5 
     ID, Name, CountryCode 
    FROM city) a 
ORDER BY 
    ID asc 

結果:

ID  Name        CountryCode 
4079 Rafah        PSE 
4078 Nablus        PSE 
4077 Jabaliya       PSE 

問題出在哪裏!?我無法得到它!

+2

你沒有得到什麼?你有兩個不同的查詢,他們返回兩個不同的結果集。我真的不知道哪裏會出現混淆。一點指導:當你使用'TOP'時總是使用'ORDER BY1'。 –

+0

當我執行兩個subquerys:'選擇TOP 5 ID,名稱,國家代碼從城市'和'選擇TOP 5 ID,名稱,國家代碼從城市秩序編號' 我得到相同的結果!那麼爲什麼在同一個父查詢中使用它們給了我們不同的結果! –

+1

沒有'order by'的'top 5'選擇5條隨機記錄。如果這5條記錄是你所期望的,那麼它的事故 –

回答

1

按順序將會在選擇頂部指令前先發生。因此,在你給出的例子中,它會按ID排序,然後選擇前5個記錄。這是一個子查詢,所以外部查詢將按照降序排列這5條記錄,然後選擇前3位。

當您通過子查詢中刪除順序時,前5條指令將簡單地返回它遇到的前5個記錄。如果表中有一個聚集索引,可能會受到聚集索引的影響,因此如果聚集ID,它可能會得到相同的結果,但是如果它是其他內容就像創建的日期一樣會影響結果返回的順序。請注意,即使考慮聚集索引,訂單也無法保證。查詢並行性也可能發揮作用。

基本上,檢查表上的聚集索引,因爲這可能表示順序,但不能保證它。希望這是有道理的。