国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > SQL Server > 正文

SQL Server 常用分頁SQL

2024-08-31 00:55:58
字體:
來源:轉載
供稿:網友
SQL Server 常用分頁SQL

今天無聊和朋友討論分頁,發現網上好多都是錯的。網上經常查到的那個Top Not in 或者Max 大部分都不實用,很多都忽略了Order和性能問題。為此上網查了查,順帶把2000和2012版本的也補上了。

先說說網上常見SQL的錯誤或者說局限問題

select top 10 * from table1where id not in(    select top 開始的位置 id     from table1)

這樣的確是可以取到分頁數據,但是這是默認排序的,如果要按其中一列排序呢?那order by 加在哪里呢?里外都加,顯然不行,外面的Order不起作用,只能嵌套,Oh my god,編程三個Select了,這效率。

為了好用效率高,總體思路還是老老實實的用RowNumber解決,但是SQL2000沒有RowNumber,其實我們可以通過臨時表自增列搞定,不多說,上例子。

SQL 2000 用臨時表解決,通過在臨時表中增加自增列解決RowNumber。
DECLARE @Start INTDECLARE @End INTSELECT @Start = 14000,@End = 14050CREATE TABLE #employees (RowNumber INT IDENTITY(1,1),LastName VARCHAR(100),FirstName VARCHAR(100),EmailAddress VARCHAR(100))INSERT INTO #employees (LastName, FirstName, EmailAddress)SELECT LastName, FirstName, EmailAddress FROM Employee ORDER BY LastName, FirstName, EmailAddressSELECT LastName, FirstName, EmailAddress FROM #employeesWHERE RowNumber > @Start AND RowNumber <= @EndDROP TABLE #employeesGO

  

SQL 2005/2008 由于支持了Row_Number于是通過派生表的方式解決(兩個嵌套)
DECLARE @Start INTDECLARE @End INTSELECT @Start = 14000,@End = 14050SELECT LastName, FirstName, EmailAddressFROM (SELECT LastName, FirstName, EmailAddress,ROW_NUMBER() OVER (ORDER BY LastName, FirstName, EmailAddress) AS RowNumberFROM Employee) EmployeePageWHERE RowNumber > @Start AND RowNumber <= @EndORDER BY LastName, FirstName, EmailAddressGO

  

SQL 2005/2008 或者用CTE的方式實現,和派生表一樣,就是好看點,執行計劃都一樣。
DECLARE @Start INTDECLARE @End INTSELECT @Start = 14000,@End = 14050;WITH EmployeePage AS(SELECT LastName, FirstName, EmailAddress,ROW_NUMBER() OVER (ORDER BY LastName, FirstName, EmailAddress) AS RowNumberFROM Employee)SELECT LastName, FirstName, EmailAddressFROM EmployeePageWHERE RowNumber > @Start AND RowNumber <= @EndORDER BY LastName, FirstName, EmailAddressGO

  

SQL SERVER 2012 比較給力支持了OFFSET,于是一個Select結束戰斗
SELECT LastName, FirstName, EmailAddressFROM EmployeeORDER BY LastName, FirstName, EmailAddressOFFSET 14000 ROWSFETCH NEXT 50 ROWS ONLY;

  

最后說下,根據老外的文章,在2012里,如果前面加上TOP(50),那么執行計劃就會少讀很多行數據(讀的精準了),提高性能。但是鑒于本人手頭沒2012也無法測試。至少在2008R2上加不加TOP執行計劃都一樣。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 朔州市| 新建县| 攀枝花市| 舟曲县| 京山县| 隆回县| 汉中市| 海阳市| 精河县| 建瓯市| 松溪县| 清水河县| 讷河市| 北辰区| 福泉市| 海伦市| 临猗县| 镇宁| 汝阳县| 剑河县| 张家口市| 柏乡县| 诸暨市| 盈江县| 额尔古纳市| 广水市| 康乐县| 伊宁县| 汕头市| 襄樊市| 通山县| 阿坝| 会宁县| 义乌市| 阿克| 进贤县| 菏泽市| 阿勒泰市| 兴城市| 嘉祥县| 都匀市|