有100個產品,其中最高價格的爲200元,而200元的產品共有40個,
如今好了,對每頁30進行分頁:
declare @PageSize int--30
declare @Page int
declare @LowerCount int
if @Page = 1
begin
select top(@PageSize) from dbo.Product order by Price desc
end
else
begin
set @LowerCount = (@Page-1)*@PageSize
select * from dbo.Product
where Price < (select min(Price) from (select top (@LowerCount) Price from dbo.Product order by Price desc AS tblTmp ))
order by Price desc
end
如今好了,第1頁是正常的,第二頁,則丟失了10個200元的產品了!
因此,須要做以下改進:
if @Page = 1
begin
select top(@PageSize) from dbo.Product order by Price desc
end
else
begin
set @LowerCount = (@Page-1)*@PageSize
select * from dbo.Product
where Id not in (select top (@LowerCount) Id from dbo.Product order by Price desc,Id desc)
order by Price desc,Id desc
end
注:dbo.Product.Id爲標識列(1,1)
小結:
第一個解法效率最高,但不適用於不具備惟一性的列,第二個解法效率低一點,但通用性最好。