程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> 其他數據庫知識 >> MSSQL >> SQL行號排序和分頁(SQL查詢中拔出行號 自界說分頁的另類完成)

SQL行號排序和分頁(SQL查詢中拔出行號 自界說分頁的另類完成)

編輯:MSSQL

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的分頁效力和它差不多。
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved