zoukankan      html  css  js  c++  java
  • SQL分页查询之我见

    最近在研究SQL分页,也在网上查过很多资料,我发现SQL分页查询其实也就2中方式:

    1:排序字段唯一(这种方式可以用取最大值或者最小值来做,速度最快)。

    2:排序字段不唯一(这种方式,就用很多方面,可以用临时表, Not In,WITH ROWNUMBER OVER 等,这种方式在大数据量的时候就有些满了。

    本来想写个通用的存储过程,但是写存储过程,无法传递查询条件参数,因此谢了一个C#版的生成SQL语句的方法。

    代码
    /// <summary>
    /// 生成分页查询SQL语句
    /// </summary>
    /// <param name="strQuery">查询表或视图</param>
    /// <param name="pageNumber">页码</param>
    /// <param name="pageSize">页大小</param>
    /// <param name="strOrder">排序字段</param>
    /// <param name="isOnly">排序字段是否唯一</param>
    /// <param name="strFields">查询字段</param>
    /// <param name="strWhere">条件(不带where)</param>
    private static string MakeSql(string strQuery,int pageNumber,int pageSize,string strOrder,bool isOnly,string strFields,string strWhere)
    {
    string strSQl = "";
    string strWhereAndWhere=strWhere==""?"":"where "+strWhere;
    string strWhereAndAnd = strWhere == "" ? "" : "and " + strWhere;
    string strOrderAndOrder = strOrder == "" ? "" : "order by " + strOrder;
    if (pageNumber == 1)//如果是第一页
    {
    strSQl
    = string.Format("Select top {0} {1} from {2} {3} {4}", pageSize, strFields, strQuery, strWhereAndWhere, strOrderAndOrder);
    return strSQl;
    }
    else if (isOnly)//排序字段唯一
    {
    string strTemp = "";

    if (strOrder.ToLower().IndexOf("desc") > 0) //如果有降序
    {
    strTemp
    = "< (select min";
    }
    else
    {
    strTemp
    = "> (select max";
    }
    string strOrderNoDesc = strOrder.ToLower().Replace("desc", "").Replace("asc", "");//没有排序标志的字段名
    //{0}:页大小
    //{1}:查询字段
    //{2}:表明或视图
    //{3}:排序字段
    //{4}:临时字符
    //{5}:pageSize*pageCount
    //{6}:带where的条件
    //{7}:带order by 排序字段
    //{8}:带and 的条件
    strSQl = string.Format(@"Select top {0} {1} from {2} where {3} {4} ({3}) from (select top {5} {3} from {2} {6} {7} ) as T) {8} {7}"
    , pageSize, strFields, strQuery, strOrderNoDesc, strTemp, pageSize
    * pageNumber, strWhereAndWhere, strOrderAndOrder, strWhereAndAnd);
    }
    else //排序字段不唯一的分页:有很多种,个人感觉用WITH ROW比较快一点
    {
    //{0}:带order by 排序字段
    //{1}:查询字段
    //{2}:表明
    //{3}:带where的条件
    //{4}:pageSize*pageNumber+1
    //{5}:pageSize*(pageNumber+1)
    strSQl = string.Format("WITH OrderedOrders AS(Select ROW_NUMBER() OVER ({0}) as RowNumber,{1} from {2} {3}) Select {1} from OrderedOrders WHERE RowNumber between {4} and {5}"
    ,strOrderAndOrder,strFields,strQuery,strWhereAndWhere,pageSize
    *pageNumber+1,pageSize*(pageNumber+1));
    }
    return strSQl;
    }

    这个代码没有考虑组合排序,以后会加上。

    第一次发博文,请大家多多指点。

  • 相关阅读:
    div 垂直居中的方法
    vs code添加到鼠标右键
    win10系统迁移到新的硬盘
    使用layui iframe弹层,各弹层之前的传值问题
    layui js动态添加的面板不能折叠
    Nginx系列6:对称加密与非对称加密各自的应用场景
    Nginx系列5:从网络原理来看SSL安全协议
    Nginx系列0:Nginx学习历程
    加扰与加密&解扰与解密
    微信小程序学习过程
  • 原文地址:https://www.cnblogs.com/wudiliujie/p/1818593.html
Copyright © 2011-2022 走看看