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;
    }

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

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

  • 相关阅读:
    MySQL 数据库报错 Too many connections
    C# 字符串倒序输出
    C# Guid.NewGuid()
    C# MongoDB 查询所有集合名
    MongoDB 错误be UuidLegacy, not UuidStandard
    jstree 反选,测试400条数据左右有点卡
    js Date对象日期格式化
    敏捷开发-Scrum
    linux centos7 和 windows下 部署 .net core 2.0 web应用
    部署SSL站点 IIS+asp.net
  • 原文地址:https://www.cnblogs.com/wudiliujie/p/1818593.html
Copyright © 2011-2022 走看看