Ⅰ sql語句分頁和排序問題
create proc sp_page -- 資料庫名,表名,欄位名,第幾頁,每頁行數
(@dataname varchar(20),@tablename varchar(20) ,@fieldname varchar(20),@page_cur int,@page_size int)
as
declare @sqlstr varchar(200)
set @sqlstr='select top '+cast( @page_size as varchar(20))+' * from '
+@dataname+'..'+@tablename+' where '+@fieldname+' not in ( select top '
+cast((@page_cur-1)*@page_size as varchar(20))+' '+@fieldname+' from '
+@dataname+'..'+@tablename+' order by '+@tablename+'.'@fieldname')'
execute(@sqlstr)
go
--exec sp_page pubs,jobs,job_id,3,2
Ⅱ SQL分頁的幾種方法
方法一 使用offset fetch next(2012版本及以上版本才可以使用)
方法二 使用row_number()函數
利用row_number() over(order by id desc)函數計算出行數,選定相應的行數返回即可(2005版本以上才可以使用)
使用存儲過程封裝
Ⅲ 幾種常見SQL分頁方式
createtablepagetest
(
idintidentity(1,1)notnull,
col01intnull,
col02nvarchar(50)null,
col03datetimenull
)
--分頁1,notin/top
selecttop50*frompagetest
whereidnotin()
orderbyid
--分頁2,notexists
selecttop50*frompagetest
wherenotexists
(select1from()awherea.id=pagetest.id)
orderbyid
--寫法3,max/top
selecttop50*frompagetest
whereid>(selectmax(id)from()a)
orderbyid
--分頁4,row_number()
selecttop50*from
(selectrow_number()over(orderbyid)rownumber,*frompagetest)a
whererownumber>9900
select*from
(selectrow_number()over(orderbyid)rownumber,*frompagetest)a
whererownumber>9900andrownumber<9951
select*from
(selectrow_number()over(orderbyid)rownumber,*frompagetest)a
--分頁5,在csdn上一帖子看到的,row_number()變體,不基於已有欄位產生記錄序號,先按條件篩選以及排好序,再在結果集上給一常量列用於產生記錄序號
select*
from(
selectrow_number()over(orderbytempColumn)rownumber,*
from(selecttop9950tempColumn=0,*frompagetestwhere1=1orderbyid)a
)b
whererownumber>9900
結論:
1.max/top,ROW_NUMBER()都是比較不錯的分頁方法。相比ROW_NUMBER()只支持sql2005及以上版本,max/top有更好的可移植性,能同時適用於sql2000,access。
2.not exists感覺是要比not in效率高一點點。
3.ROW_NUMBER()的3種不同寫法效率看起來差不多。
4.ROW_NUMBER() 的變體基於這個測試效率實在不好。
Ⅳ sql 分頁
SELECTTOP10*
FROM(SELECT*
FROM(selects.PositionNameassName,
h.MonValueasmonValue,
ROW_NUMBER()OVER(ORDERBYs.PositionNameASC)ASRNUM
fromHourSourceh
LEFTJOINPollutantponp.PollutantCode=h.PollutantCode
LEFTJOINStationsons.StationCode=h.StationCode
whereh.TimePointBETWEEN'2015-01-0111:00'and
'2015-01-0112:00'
ands.stationIdin(1,2))bbPIVOT(MAX(monvalue)FORpNamein(O3,CO,PM10))ASpvt)A
WHEREA.RNUM>0andA.rnum<10
sqlserver 資料庫?
Ⅳ sql分頁顯示的問題
lz,這個問題其實和普通的分頁問題是一樣的,只是規則不同而已,普通的分頁是以每頁條數來分的,比如每頁20條,正排前20條,倒排前20條,這樣兩頁的數據就出來了,這樣通過拼接sql可以完成,這種分頁函數方法,網上多了去了。你這個問題呢只是變了角度,其實本質是一樣的,你這里是以分類數來決定分頁。我寫個簡單的sql給你看一下
createtable1121
(idchar(1));
insertinto1121
select'A'
UNIONALL
SELECT'A'
UNIONALL
SELECT'B'
UNIONALL
SELECT'B'
UNIONALL
SELECT'C'
UNIONALL
SELECT'D'
UNIONALL
SELECT'D'
UNIONALL
SELECT'E'
UNIONALL
SELECT'E'
UNIONALL
SELECT'E'
UNIONALL
SELECT'F'
UNIONALL
SELECT'G';
SELECTT1.id,T2.RNFROM1121T1,
(SELECTT.ID,ROW_NUMBER()OVER(ORDERBYID)RNFROM(
SELECTDISTINCTIDFROM1121)T)T2WHERET1.ID=T2.id;
--結果
A 1
A 1
B 2
B 2
C 3
D 4
D 4
E 5
E 5
E 5
F 6
G 7
或者還可以這樣
SELECTT1.id,T2.RN%3+1FROM1121T1,
(SELECTT.ID,ROW_NUMBER()OVER(ORDERBYID)RNFROM(
SELECTDISTINCTIDFROM1121)T)T2WHERET1.ID=T2.id;
--結果
A 2
A 2
B 3
B 3
C 1
D 2
D 2
E 3
E 3
E 3
F 1
G 2
這樣寫希望對你理解有幫助,有問題再追問吧,望採納。
Ⅵ SQL的幾種分頁演算法
利用SQL語句分頁要看你用的什麼資料庫。
Oracle資料庫可以使用ROWNUM或row_number(),例如:Select * from (select ROWNUM rn, t.* from table t) where rn between 11 and 20;
Select * from (select row_number() over (ORDER BY col1) rn, t.* from table t) where rn between 11 and 20;
SQLServer資料庫可以用Top或者row_number()函數,道理同上。
利用SQL分頁有局限性,就是針對不同的資料庫有不同的寫法,所以通常會在應用程序裡面做分頁通用性比較強。但是對於數據量非常龐大的應用來說,還是用SQL分頁比較適合。
Ⅶ sql分頁問題
SQL分頁語句
-前提是必需有一列是自動增長類型,唯一性
--方法一
SELECT
DISTINCT
TOP
8
CategoryID
FROM
tbl_Proct_Procts
WHERE
(UserID
=
73)
AND
(CategoryID
>
(SELECT
MAX(categoryid)
FROM
(SELECT
DISTINCT
TOP
16
categoryid
FROM
tbl_proct_procts
where
userid=73
ORDER
BY
categoryid)
AS
b))
ORDER
BY
CategoryID
--方法二
select
top
10
*
from
[order
details]
where
orderid>all(select
top
10
orderid
from
[order
details]
order
by
orderid)
order
by
orderid