今天要介绍的是SQL的分页技巧,首先先介绍在MSSQL2012版中新增的分页语法,实务上主要应用在加载DataTable的时候,配合上页数,让网页不会每一次都查询全部的资料,导致效能变差。
以下使用北风资料库的[Customers]做测试:
一、使用OFFSET ROWS
SELECT *FROM Customers--如果要使用分页语法,一定要加上排序,不然会出错。ORDER BY CustomerID --这一行语法是指「略过」前5行,列出从第6行开始到最后一笔资料。OFFSET 5 ROWS
结果会如下:
Function:
1.OFFSET intA ROWS
此函数会略过前intA笔资料行,从第intA+1笔开始列到最后一笔。
二、使用OFFSET intA ROWS
搭配FETCH NEXT intB ROWS ONLY
SELECT *FROM Customers--如果要使用分页语法,一定要加上排序,不然会出错。ORDER BY CustomerID --这一行语法是指「略过」前2行,列出从第3行开始的8笔资料。OFFSET 2 ROWS FETCH NEXT 8 ROWS ONLY
结果会如下:
Function:
1.OFFSET intA ROWS FETCH NEXT intB ROWS ONLY
此函数会略过前intA笔资料行,从第intA+1笔开始列出intB笔资料。
以上分页语法的使用方法,但是此语法是在2012版本中才出现的,如果是在2008等版本要使用分页时,可以用以下方式:
三、使用ROW_NUMBER()
搭配OVER(ORDER BY AAA)
SELECT *FROM(--先用ROW_NUMBER()替每笔资料设定编号SELECT ROW_NUMBER() OVER(ORDER BY CustomerID) rowNumber,*FROM Customers) myTable--再找出编号大于2,且小于等于2+8的资料WHERE rowNumber>2 AND rowNumber<=2+8
结果会是和第二种方式一样:
说明一下这种方式的应用:
第一步用ROW_NUMBER()
搭配OVER(ORDER BY AAA)
替每笔资料设定编号。
第二步把他包成一个table,因为如果直接把ROW_NUMBER()
产生的栏位放进WHERE里面会出错。
第三步再最外层使用WHERE,找出编号大于2,且小于等于2+8的资料行,这样的结果就和从2到8行一样。
以上,如果有问题或观念错误的地方,麻烦留言指教了!谢谢各位!