SQL行號排序和分頁(SQL查詢中拔出行號 自界說分頁的另類完成)。本站提示廣大學習愛好者:(SQL行號排序和分頁(SQL查詢中拔出行號 自界說分頁的另類完成))文章只能為提供參考,不一定能成為您想要的結果。以下是SQL行號排序和分頁(SQL查詢中拔出行號 自界說分頁的另類完成)正文
(一)行號顯示和排序
1.SQL Server的行號
A.SQL 2000應用identity(int,1,1)和暫時表,可以顯示行號
SELECT
identity(int,1,1) AS ROWNUM,
[DataID]
INTO #1
FROM DATAS
order by DataID;
SELECT * FROM #1
B.SQL 2005供給一個很好用的函數row_number(),
可以直接用來顯示行號,固然也能夠應用SQL 2000的identity
SELECT
row_number()over(ORDER BY DataID) AS ROWNUM,
[DataID]
FROM DATAS;
這裡假如添加排序功效,則先排序再添加行號
2.ORACLE的行號顯示
應用ROWNUM
SELECT
ROWNUM,
[DataID]
FROM DATAS
order by DataID
留意:先加行號再排序,假如想排序好再加行號就要應用子查詢
3.取前n條數據
A.SQL版
select top n [DataID] from DATAS
B.ORACLE版
SELECT
[DataID]
FROM DATAS where ROWNUM<=n
個中,n>=1
ORACLE的ROWNUM不克不及運用於年夜於,只能 ROWNUM= 1, 或許<= 年夜於1 的天然數
(二)SQL分頁的幾種方法
以每頁10條數據為例,查詢第三頁數據,即21-30這些記載
1.分頁計劃一:(應用Not In和SELECT TOP分頁)
語句情勢:
SELECT TOP 10 *
FROM DATAS
WHERE DataID NOT IN
(SELECT TOP 20 DataID
FROM DATAS
ORDER BY DataID)
ORDER BY DataID
2.分頁計劃二:(應用ID年夜於若干和SELECT TOP分頁)
語句情勢:
SELECT TOP 10 *
FROM DATAS
WHERE ID >
(SELECT MAX(DataID)
FROM (SELECT TOP 20 DataID
FROM DATAS
ORDER BY DataID) AS T)
ORDER BY DataID
3.分頁計劃三
select top 10 DataID from
(SELECT top 30
[DataID]
FROM DATAS
order by dataid desc) A
ORDER BY DataID
4.分頁計劃四:(應用SQL的游標存儲進程分頁)
create procedure SqlPager
@sql nvarchar(8000), --查詢字符串
@curpage int, --第N頁
@pagesize int --每頁行數
as
set nocount on
declare @P int, --P是游標的id
@rowcount int
exec sp_cursoropen @P output,@sql,@scrollopt=1,@ccopt=1, @rowcount=@rowcount output
select ceiling(1.0*@rowcount/@pagesize) as 總頁數,@rowcount as 總行數,@curpage as 以後頁
set @curpage=(@curpage-1)*@pagesize+1
exec sp_cursorfetch @P,16,@curpage,@pagesize
exec sp_cursorclose @P
set nocount off
辦法整頓以下:
代碼基於pubs樣板數據庫
在SQL中,普通就這兩種辦法.
1.應用暫時表
可使用select into 創立暫時表,在第一列,參加Identify(int,1,1)作為行號,
如許在發生的暫時表中,成果集就有了行號.也是今朝效力最高的辦法.
這類辦法不克不及用於視圖
set nocount on
select IDentify(int,1,1) 'RowOrder',au_lname,au_fname into #tmp from authors
select * frm #tmp
drop table #tmp
2.應用自銜接
不消暫時表,在SQL語句中,靜態的停止排序.這類辦法用到的銜接是自銜接,銜接關系普通是
年夜於,
select rank=count(*), a1.au_lname, a1.au_fname
from authors a1 inner join authors a2 on a1.au_lname + a1.au_fname >= a2.au_lname + a2.au_fname
group by a1.au_lname, a1.au_fname
order by count(*)
運轉成果:
rank au_lname au_fname
----------- ---------------------------------------- --------------------
1 Bennet Abraham
2 Blotchet-Halls Reginald
3 Carson Cheryl
4 DeFrance Michel
5 del Castillo Innes
6 Dull Ann
7 Greene Morningstar
... ....
缺陷:
1.應用自聯接,所以該辦法不實用於處置年夜量行。它實用於處置幾百行。
關於年夜型表,必定要應用索引以免停止年夜規模的搜刮,或用第一種辦法.
2.不克不及正常處置反復值。當比擬反復值時,會湧現不持續的行編號。
假如不願望湧現這類景象,可以在電子表格中拔出成果時隱蔽排序列,而是應用電子表格編號。
或用第一種辦法
長處:
這些查詢可以用於視圖和成果格局設置中
在成果集中拔出了行號,如今便可以將成果聚集緩存起來,然後應用DataView,參加過濾前提
RowNum>PageIndex*PageSize And RowNum<=(PageIndex+1)*PageSize
就可以完成疾速的分頁,並且豈論你的頁面數據綁定控件是甚麼(DataList,DataGrid,照樣Repeate都可以)。
假如你應用的是DataGrid,那末建議不要應用這類技巧。由於DataGrid的分頁效力和它差不多。