方法1: 适用于 SQL Server 2000/2005
SELECT TOP 頁大小 *
FROM table1
WHERE id NOT IN
(
SELECT TOP 頁大小*(頁數-1) id FROM table1 ORDER BY id
)
ORDER BY id
方法2:
适用于 SQL Server 2000/2005
--順序寫法:
SELECT TOP 頁大小 *
FROM table1
WHERE id >=
(
SELECT ISNULL(MAX(id),0) //MAX(id)為空時,替換為0
FROM
(
SELECT TOP 頁大小*(頁數-1)+1 id FROM table1 ORDER BY id
) A
)
ORDER BY id
--降序寫法:
SELECT TOP 頁大小 *
FROM table1
WHERE id <=
(
SELECT ISNULL(MIN(id),0)
FROM
(
SELECT TOP 頁大小*(頁數-1)+1 id FROM table1 ORDER BY id Desc
) A
)
ORDER BY id Desc
方法3:
适用于 SQL Server 2005
SELECT TOP 頁大小 *
FROM
(
SELECT ROW_NUMBER() OVER (ORDER BY id) AS RowNumber,* FROM table1
) A
WHERE RowNumber > 頁大小*(頁數-1)
說明,頁大小:每頁的行數;頁數:第幾頁。使用時,請把“頁大小”和“頁大小*(頁數-1)”替換成數字。
其它的方案:如果沒有主鍵,可以用臨時表,也可以用方案三做,但是效率會低。
建議優化的時候,加上主鍵和索引,查詢效率會提高。
通過SQL 查詢分析器,顯示比較:我的結論是:
分頁方案二:(利用ID大于多少和SELECT TOP分頁)效率最高,需要拼接SQL語句
分頁方案一:(利用Not In和SELECT TOP分頁) 效率次之,需要拼接SQL語句
分頁方案三:(利用SQL的遊标存儲過程分頁) 效率最差,但是最為通用
網上抄的
ISNULL
使用指定的替換值替換NULL。
文法
ISNULL ( check_expression , replacement_value )
參數
check_expression
将被檢查是否為NULL的表達式。check_expression 可以是任何類型的。
replacement_value
在check_expression 為NULL時将傳回的表達式。replacement_value 必須與check_expresssion 具有相同的類型。
傳回類型
傳回與check_expression 相同的類型。
注釋
如果check_expression 不為NULL,那麼傳回該表達式的值;否則傳回replacement_value。
SELECT SUBSTRING(title, 1, 15) AS Title, type AS Type,
ISNULL(price, 0.00) AS Price //價格為空時顯示為0.00
FROM titles
使用with 可以使分頁子產品化起來,先正常查詢,再分頁(已固定)
declare @PageSize int =2;
declare @PageIndex int =1;
with td as (select * from lmsField)
select top (cast( @PageSize as int)) * from( select row_number()over(order by UpdateTime desc) as RowNumber,* from td) tab where RowNumber>((cast (@PageSize as int))*((cast(@PageIndex as int))-1))
添加一行totalCount所有資料行
declare @PageSize int =2;
declare @PageIndex int =1;
with td as (select * from lmsField)
select top (cast( @PageSize as int)) *,TotalCount=(select count(1) from td) from( select row_number()over(order by UpdateTime desc) as RowNumber,* from td) tab where RowNumber>((cast (@PageSize as int))*((cast(@PageIndex as int))-1))
sql2012新增分頁的方法 offset fetch
跟EF裡面的Take,Skip意思差不多,就是跳過指定行數,再傳回指定的行數
select count(1) over() as TotalCount,* from T_OrderInfo order by CreateTime desc offset 5 rows fetch next 3 rows only;
select count(1) over() as TotalCount,* from T_OrderInfo order by CreateTime desc offset 0 row fetch first 3 rows only;