文章出處

摘自:

http://www.cnblogs.com/huanghai223/archive/2010/10/26/1861961.html

“從100萬條記錄中的得到成績最高的記錄”。看到這個題目,通常我們的做法是:

select top 1 * from student order by score desc

但是這樣做你會發現,如果有幾個人分數并列第一,這樣就只能取到一個記錄。用下面的代碼的話,就可以正確地取出分數第一的所有記錄:

select top 1 with ties * from student order by score desc

由于以前沒有用過with ties ,看到這個比較新奇,故隨后MSDN,Google,Baidu之。

 

WITH TIES

 

指定從基本結果集中返回額外的行,對于 ORDER BY 列中指定的排序方式參數,這些額外的返回行的該參數值與 TOP n (PERCENT) 行中的最后一行的該參數值相同。只能在 SELECT 語句中且只有在指定了 ORDER BY 子句之后,才能指定 TOP...WITH TIES。

注意:返回的記錄關聯順序是任意的。ORDER BY 不影響此規則

來源:MSDN,http://msdn.microsoft.com/zh-cn/library/ms189463.aspx

MSDN中指出這些額外的返回行的參數值與TOP n(PERCENT)行中的最后一行的該參數值相同。這個地方該怎么理解呢?其實是如果按照order by 參數排序TOP n(PERCENT)返回了前面n(pencent)個記錄,但是n+1…n+k條記錄和排序后的第n條記錄的參數值(order by 后面的參數)相同,則n+1、…、n+k也返回。n+1、…、n+k就是額外的返回值。

舉個例子,假設有如下記錄:

studentID courseName score
09212744 數據庫 90
09212745 數據庫 90
09212746 數據庫 90
09212750 數據庫 85
09212719 數據庫 84
09212720 數據庫 80
09212742 數據庫 80
09212751 數據庫 75
09212755 數據庫 74
09212740 數據庫 70
 
select top 6 * from student order by score desc
將返回如下結果:
image 
圖1 不帶with ties(注意最好一條記錄)
select top 6 with ties * from student order by score desc

將返回如下結果:

image

圖2  帶with ties(多了第7條記錄) 

結果一目了然,不用多解釋!

插曲:其實在這個過程中有個小插曲,我首先是Google “with ties” 搜到了這篇文章With Ties on SQL Server 2005。內容如下(翻譯之后):

SQL Server 2005有一個功能來選擇top記錄,但是我要說的是,我希望同樣的數量將被加載。舉例來說,我想從表中記錄選擇前5名的貨幣匯率,但是如果其中一個記錄有相同的值,不要讓算作前5名。通過下面的例子來證明。

  • select top 5 * from batch where module = ‘CA’ order by curyrate desc

BatNbr CuryRate 
000345 9900 
000350 9900 
000351 9900 
000400 9800 
000450 9750

如果你看結果,你會看到9900被加載了3次,讓我們看看如果運行下面的腳步。

  • select top 5 with ties * from batch where module = ‘CA’ order by CuryRate desc

BatNbr CuryRate 
000345 9900 
000350 9900 
000351 9900 
000400 9800 
000450 9750 
000451 9750 
000475 9500 
000456 9400

這就是With Ties on SQL Server 2005的全部內容,這導致我對with ties理解錯誤!認為加上with ties后,會返回除了重復的記錄會返回n條記錄,還一直認為是MSDN解釋錯了(⊙﹏⊙b汗)。而且這篇文章被許多人裝載了,博客園和csdn都要,不知道我對那片文章理解錯了還是他本來就錯了。如果是我理解錯了,請告訴我,謝謝!

 

 

 

 

------------>>>

 


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()