Ⅰ 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