亚洲香蕉成人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
国产精品成人av性教育| 亚洲国产精彩中文乱码av在线播放| 久久福利视频网| 久久成人在线视频| 中文字幕亚洲精品| 欧美激情一级精品国产| 欧美亚洲第一区| 亚洲自拍偷拍一区| 国产福利视频一区二区| 精品国产拍在线观看| 日韩成人激情在线| 91黑丝在线观看| 91免费欧美精品| 亚洲午夜女主播在线直播| 亚洲一区二区三区在线视频| 亚洲成人久久网| 国产女人18毛片水18精品| 热久久99这里有精品| 国产日韩欧美在线观看| 国产亚洲精品91在线| 日本高清不卡在线| 九九精品视频在线观看| 国产精品福利在线| 久久影院资源站| 久久久久久国产精品三级玉女聊斋| 亚洲人成电影网站| 欧美国产激情18| 日本亚洲欧美三级| 亚洲免费人成在线视频观看| 国产日韩中文字幕在线| 国产精品一区二区性色av| 国模叶桐国产精品一区| 精品亚洲一区二区三区在线观看| 91av福利视频| 亚洲码在线观看| 国产精品视频白浆免费视频| 国产精品久久久久久久久久新婚| 国产亚洲精品日韩| 欧美日本高清视频| 日韩美女在线观看一区| 伊人久久男人天堂| 日韩精品免费电影| 国产精品网址在线| 亚洲字幕在线观看| 欧美黄色片视频| 久久久久久久亚洲精品| 欧美激情在线有限公司| 欧美成人免费va影院高清| 亚洲一区二区久久久久久| 欧美电影免费观看电视剧大全| 亚洲日韩第一页| 久久久久中文字幕2018| 久久久国产精品视频| 久久国产精品久久久| 91久久夜色精品国产网站| 国产精品精品一区二区三区午夜版| 久久久久国产精品免费| 亚洲精品视频久久| 日韩一二三在线视频播| 97精品伊人久久久大香线蕉| 国产精品久久久久久久久免费看| 国产精品免费久久久久久| 91亚洲va在线va天堂va国| 国产欧美日韩视频| 91精品久久久久久久久久| 国产精品人人做人人爽| 亚洲精品一区久久久久久| 日韩av在线一区二区| 日本欧美黄网站| 欧美特黄级在线| 911国产网站尤物在线观看| 一区二区三区精品99久久| 久久久亚洲成人| 日韩精品久久久久久福利| 在线成人激情黄色| 久久亚洲精品国产亚洲老地址| 97视频在线观看免费高清完整版在线观看| 亚洲免费电影一区| 色播久久人人爽人人爽人人片视av| 亚洲精品91美女久久久久久久| 日韩电影在线观看永久视频免费网站| 成人做爽爽免费视频| 第一福利永久视频精品| 欧美黄色小视频| 欧美又大粗又爽又黄大片视频| 国产精品日韩在线| 久久99热这里只有精品国产| 91免费电影网站| 黄色成人av在线| 精品久久久久久久久久久久久久| 亚洲综合精品伊人久久| 中文字幕一区二区精品| 亚洲乱码国产乱码精品精| 国产精品久久久久久久久久久新郎| 国产精品高清免费在线观看| 亚洲美女视频网站| 久久久噜噜噜久久中文字免| 日韩电影在线观看免费| 色偷偷av一区二区三区乱| 欧美做受高潮电影o| 亚洲精品国产精品乱码不99按摩| 亚洲日本成人网| 欧美刺激性大交免费视频| 欧美日韩国产一区二区三区| 在线视频欧美日韩精品| 精品久久久久久久久中文字幕| 国产精品视频色| 精品日韩中文字幕| 亚洲国产成人精品一区二区| 91av在线精品| 国产丝袜一区二区| 国产精品视频导航| 亚洲国产精品成人精品| 日韩精品中文字幕视频在线| 国产精品成人播放| 久久久欧美精品| 日韩国产欧美精品一区二区三区| 国产精品视频免费在线| 91国内免费在线视频| 欧美在线一区二区视频| 在线电影中文日韩| 欧美黄网免费在线观看| 久久久女女女女999久久| 精品高清一区二区三区| 26uuu亚洲伊人春色| 国产精品日韩欧美综合| 精品国产一区二区三区久久狼黑人| 91精品久久久久久综合乱菊| 一区二区三区国产在线观看| 粉嫩老牛aⅴ一区二区三区| 国产精品一区二区av影院萌芽| 亚洲国产欧美在线成人app| 日韩在线精品视频| 亚洲级视频在线观看免费1级| 国产免费亚洲高清| 欧美成人精品一区二区三区| 日韩在线观看免费高清| 亚洲美女免费精品视频在线观看| 欧美丝袜一区二区三区| 亚洲美女性生活视频| 亚洲偷熟乱区亚洲香蕉av| 精品久久中文字幕久久av| xvideos国产精品| 日韩中文视频免费在线观看| 欧美大胆在线视频| 麻豆成人在线看| 国产精品自拍偷拍视频| 国产热re99久久6国产精品| 久久久亚洲天堂| 日韩在线视频观看| 九九视频直播综合网| 久久免费精品日本久久中文字幕| 欧美日本在线视频中文字字幕| 91在线观看免费网站| 国产精品久久久久久久久男| 国产精品日韩在线播放| 国产乱人伦真实精品视频| 国产精品一二三在线| 午夜精品久久久久久久99热浪潮| 2023亚洲男人天堂| 国产福利精品av综合导导航| 国产精品久久久久av免费| 亚洲人成在线观| 亚洲欧美一区二区三区情侣bbw|