亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > 綜合 > 正文

查詢分頁的幾種Sql寫法

2024-07-21 02:46:05
字體:
來源:轉載
供稿:網友
查詢分頁的幾種Sql寫法 查詢分頁的幾種Sql寫法

摘自:http://www.cnblogs.com/zcttxs/archive/2012/04/01/2429151.html

1.創建測試環境,(插入100萬條數據大概耗時5分鐘)。

create database DBTestuse DBTest--創建測試表create table pagetest(id int identity(1,1) not null,col01 int null,col02 nvarchar(50) null,col03 datetime null)--1萬記錄集declare @i intset @i=0while(@i<10000)begin    insert into pagetest select cast(floor(rand()*10000) as int),left(newid(),10),getdate()    set @i=@i+1end

  

2.幾種典型的分頁sql,下面例子是每頁50條,198*50=9900,取第199頁數據。

--寫法1,not in/topselect top 50 * from pagetest where id not in (select top 9900 id from pagetest order by id)order by id--寫法2,not existsselect top 50 * from pagetest where not exists (select 1 from (select top 9900 id from pagetest order by id)a  where a.id=pagetest.id)order by id--寫法3,max/topselect top 50 * from pagetestwhere id>(select max(id) from (select top 9900 id from pagetest order by id)a)order by id--寫法4,row_number()select top 50 * from (select row_number()over(order by id)rownumber,* from pagetest)awhere rownumber>9900select * from (select row_number()over(order by id)rownumber,* from pagetest)awhere rownumber>9900 and rownumber<9951select * from (select row_number()over(order by id)rownumber,* from pagetest)awhere rownumber between 9901 and 9950--寫法5,在csdn上一帖子看到的,row_number() 變體,不基于已有字段產生記錄序號,先按條件篩選以及排好序,再在結果集上給一常量列用于產生記錄序號select *from (    select row_number()over(order by tempColumn)rownumber,*    from (select top 9950 tempColumn=0,* from pagetest where 1=1 order by id)a)bwhere rownumber>9900

  

3.分別在1萬,10萬(取1990頁),100(取19900頁)記錄集下測試。

測試sql:

declare @begin_date datetimedeclare @end_date datetimeselect @begin_date = getdate()<.....YOUR CODE.....>select @end_date = getdate()select datediff(ms,@begin_date,@end_date) as '毫秒'

  

1萬:基本感覺不到差異。

10萬:

4.結論:

1.max/top,ROW_NUMBER()都是比較不錯的分頁方法。相比ROW_NUMBER()只支持sql2005及以上版本,max/top有更好的可移植性,能同時適用于sql2000,access。

2.not exists感覺是要比not in效率高一點點。

3.ROW_NUMBER()的3種不同寫法效率看起來差不多。

4.ROW_NUMBER() 的變體基于我這個測試效率實在不好。原帖在這里http://topic.csdn.net/u/20100617/04/80d1bd99-2e1c-4083-ad87-72bf706cb536.html

PS.上面的分頁排序都是基于自增字段id。測試環境還提供了int,nvarchar,datetime類型字段,也可以試試。不過對于非主鍵沒索引的大數據量排序效率應該是很不理想的。

5.簡單將ROWNUMBER,max/top的方式封裝到存儲過程。

ROWNUMBER():

ALTER PROCEDURE [dbo].[Proc_SqlPageByRownumber](    @tbName VARCHAR(255),            --表名    @tbGetFields VARCHAR(1000)= '*',--返回字段    @OrderfldName VARCHAR(255),        --排序的字段名    @PageSize INT=20,               --頁尺寸    @PageIndex INT=1,               --頁碼    @OrderType bit = 0,                --0升序,非0降序    @strWhere VARCHAR(1000)='',     --查詢條件    --@TotalCount INT OUTPUT            --返回總記錄數)AS-- =============================================-- Author:      allen (liyuxin)-- Create date: 2012-03-30-- Description: 分頁存儲過程(支持多表連接查詢)-- Modify [1]:  2012-03-30-- =============================================BEGIN    DECLARE @strSql VARCHAR(5000)    --主語句    DECLARE @strSqlCount NVARCHAR(500)--查詢記錄總數主語句    DECLARE @strOrder VARCHAR(300) -- 排序類型    --------------總記錄數---------------    IF ISNULL(@strWhere,'') <>''          SET @strSqlCount='Select @TotalCout=count(*) from  ' + @tbName + ' where 1=1 '+ @strWhere    ELSE SET @strSqlCount='Select @TotalCout=count(*) from  ' + @tbName        --exec sp_executesql @strSqlCount,N'@TotalCout int output',@TotalCount output    --------------分頁------------    IF @PageIndex <= 0 SET @PageIndex = 1    IF(@OrderType<>0) SET @strOrder=' ORDER BY '+@OrderfldName+' DESC '    ELSE SET @strOrder=' ORDER BY '+@OrderfldName+' ASC '    SET @strSql='SELECT * FROM     (SELECT ROW_NUMBER() OVER('+@strOrder+') RowNo,'+ @tbGetFields+' FROM ' + @tbName + ' WHERE 1=1 ' + @strWhere+' ) tb     WHERE tb.RowNo BETWEEN '+str((@PageIndex-1)*@PageSize+1)+' AND ' +str(@PageIndex*@PageSize)    exec(@strSql)    SELECT @TotalCountEND復制代碼
public static SqlParameter MakeInParam(string ParamName, SqlDbType DbType, Int32 Size, object Value)        {            return MakeParam(ParamName, DbType,Size, ParameterDirection.Input, Value);        }        public static SqlParameter MakeOutParam(string ParamName, SqlDbType DbType)        {            return MakeParam(ParamName, DbType, 0, ParameterDirection.Output, null);        }        public static SqlParameter MakeParam(string ParamName, SqlDbType DbType, Int32 Size, ParameterDirection Direction, object Value)        {            SqlParameter param;            if (Size > 0)                param = new SqlParameter(ParamName, DbType, Size);            else                param = new SqlParameter(ParamName, DbType);            param.Direction = Direction;            if (!(Direction == ParameterDirection.Output && Value == null))                param.Value = Value;            return param;        }        /// <summary>        /// 分頁獲取數據列表及總行數        /// </summary>        /// <param name="tbName">表名</param>        /// <param name="tbGetFields">返回字段</param>        /// <param name="OrderFldName">排序的字段名</param>        /// <param name="PageSize">頁尺寸</param>        /// <param name="PageIndex">頁碼</param>        /// <param name="OrderType">false升序,true降序</param>        /// <param name="strWhere">查詢條件</param>        public static DataSet GetPageList(string tbName, string tbGetFields, string OrderFldName, int PageSize, int PageIndex, string strWhere)        {            SqlParameter[] parameters = {                        MakeInParam("@tbName",SqlDbType.VarChar,255,tbName),                        MakeInParam("@tbGetFields",SqlDbType.VarChar,1000,tbGetFields),                         MakeInParam("@OrderfldName",SqlDbType.VarChar,255,OrderFldName),                         MakeInParam("@PageSize",SqlDbType.Int,0,PageSize),                         MakeInParam("@PageIndex",SqlDbType.Int,0,PageIndex),                         MakeInParam("@OrderType",SqlDbType.Bit,0,OrderType),                         MakeInParam("@strWhere",SqlDbType.VarChar,1000,strWhere),                        // MakeOutParam("@TotalCount",SqlDbType.Int)                        };            return RunProcedure("Proc_SqlPageByRownumber", parameters, "ds");        }       復制代碼
View Code

調用:

public DataTable GetList(string tbName, string tbGetFields, string OrderFldName, int PageSize, int PageIndex, string strWhere, ref int TotalCount)        {            DataSet ds = dal.GetList(tbName, tbGetFields, OrderFldName, PageSize, PageIndex,  strWhere);            TotalCount = Convert.ToInt32(ds.Tables[1].Rows[0][0]);            return ds.Tables[0];        }復制代碼
View Code

注意:多表連接時需注意的地方1.必填項:tbName,OrderfldName,tbGetFields2.實例:tbName =“UserInfo u INNER JOIN Department d ON u.DepID=d.ID” tbGetFields=“u.ID AS UserID,u.Name,u.Sex,d.ID AS DepID,d.DefName” OrderfldName=“u.ID,ASC|u.Name,DESC” (格式:Name,ASC|ID,DESC) strWhere:每個條件前必須添加 AND (例如:AND UserInfo.DepID=1 )

Max/top:(簡單寫了下,需要滿足主鍵字段名稱就是"id")

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美理论电影网| 国产精品欧美风情| 国产日韩精品综合网站| 欧美激情网站在线观看| 久久久99久久精品女同性| 91av中文字幕| 日韩在线精品一区| 精品国产自在精品国产浪潮| 97香蕉超级碰碰久久免费软件| 中文字幕日韩精品在线观看| 亚洲人成伊人成综合网久久久| 精品色蜜蜜精品视频在线观看| 成人有码在线播放| 亚洲人成伊人成综合网久久久| 精品人伦一区二区三区蜜桃网站| 91中文字幕在线| 国产在线a不卡| 欧美电影免费观看网站| 欧美一级成年大片在线观看| 国产剧情久久久久久| 91精品啪在线观看麻豆免费| 久久精品视频导航| 亚洲欧美成人网| 亚洲成人中文字幕| 日韩福利伦理影院免费| 欧美亚洲国产视频| 97视频在线观看视频免费视频| 国产精品一区=区| 亚洲人在线观看| 欧美日韩国产成人在线观看| 欧美野外猛男的大粗鳮| 国产精品高潮粉嫩av| 国产精品网址在线| 国产精品欧美久久久| 91青草视频久久| 欧美视频不卡中文| 欧美成人免费网| 欧美午夜激情小视频| 97精品欧美一区二区三区| 久久久久久久久久久久久久久久久久av| 日韩小视频在线| 一本色道久久综合亚洲精品小说| 国产精品久久久久久久久久尿| 88国产精品欧美一区二区三区| 国产剧情日韩欧美| 欧美午夜视频一区二区| 欧美电影《睫毛膏》| 福利二区91精品bt7086| 精品一区二区三区四区| 国产精品露脸自拍| 国产婷婷97碰碰久久人人蜜臀| 亚洲电影成人av99爱色| 亚洲区bt下载| 欧美日韩国产精品专区| 精品视频在线播放色网色视频| 91牛牛免费视频| 国产香蕉一区二区三区在线视频| 久久久久久九九九| 亚洲自拍欧美另类| 亚洲福利视频网站| 亚洲人成网站免费播放| 欧美亚洲国产日本| 日韩av中文字幕在线免费观看| 久久天天躁日日躁| 亚洲在线www| 亚洲日韩中文字幕| 国产成人精品亚洲精品| 日韩av在线不卡| 国产亚洲a∨片在线观看| 51午夜精品视频| 一个色综合导航| 亚洲视频自拍偷拍| 欧美韩国理论所午夜片917电影| 午夜精品久久久久久久白皮肤| 国产91对白在线播放| 秋霞午夜一区二区| 色偷偷噜噜噜亚洲男人| 国产精品网址在线| 91久久国产精品91久久性色| 国外成人在线视频| 在线观看日韩欧美| 国产亚洲欧洲高清一区| 国产小视频91| 精品国产乱码久久久久久婷婷| 亚洲美女激情视频| 久久久91精品| 91精品国产成人| 久久国产精品久久国产精品| 日韩av男人的天堂| 国产精品流白浆视频| 91av福利视频| 久久视频在线观看免费| 亚洲视频综合网| 欧美性精品220| 欧美激情a∨在线视频播放| 成人深夜直播免费观看| 日韩欧美亚洲国产一区| 久久影院中文字幕| 欧洲精品在线视频| 国产精品精品久久久| 欧美日韩国产二区| 亚洲人成亚洲人成在线观看| 亚洲大尺度美女在线| 91精品国产成人www| 久久成人18免费网站| 亚洲图片欧洲图片av| 欧美成人性色生活仑片| 亚洲精品av在线播放| 亚洲男人天堂视频| 正在播放亚洲1区| 欧美专区在线播放| 不用播放器成人网| 欧洲成人在线视频| 中文字幕亚洲欧美| 福利视频第一区| 亚洲成**性毛茸茸| 亚洲社区在线观看| 色老头一区二区三区在线观看| 狠狠综合久久av一区二区小说| 欧美激情视频在线免费观看 欧美视频免费一| 日韩在线观看视频免费| 久久99久久亚洲国产| 亚洲电影免费观看高清完整版在线| 91精品国产色综合久久不卡98| 欧美巨乳在线观看| 中文字幕亚洲欧美在线| 亚洲男人天堂古典| 98精品国产高清在线xxxx天堂| 国产精品久久久久高潮| 亚洲美女久久久| 欧美在线视频免费| 欧美大片欧美激情性色a∨久久| 国外色69视频在线观看| 69精品小视频| 91在线中文字幕| 国产精品久久久久久网站| 亚洲国产精品99| 欧美精品一本久久男人的天堂| www.久久久久| 亚洲免费影视第一页| 亚洲精品第一页| 欧美多人爱爱视频网站| 国产精品偷伦一区二区| 日韩美女中文字幕| 欧美精品亚州精品| 国产精品欧美日韩一区二区| 久久精品中文字幕免费mv| 米奇精品一区二区三区在线观看| 国产精品a久久久久久| 欧美日韩爱爱视频| 日韩精品日韩在线观看| 国产69精品久久久久9| 精品久久香蕉国产线看观看亚洲| 成人黄色av播放免费| 奇米一区二区三区四区久久| 国产精品偷伦免费视频观看的| 91高清视频在线免费观看| 午夜精品一区二区三区视频免费看| 欧日韩在线观看| 日本高清不卡的在线| 中文字幕亚洲欧美一区二区三区| 国产精品欧美风情| 91精品国产91久久久久久最新| 欧美大肥婆大肥bbbbb|