摘自:
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
將返回如下結果:
圖1 不帶with ties(注意最好一條記錄)
select top 6 with ties * from student order by score desc
將返回如下結果:
圖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都要,不知道我對那片文章理解錯了還是他本來就錯了。如果是我理解錯了,請告訴我,謝謝!
------------>>>
文章列表