• Access大数据高效分页语句


    Access大数据高效分页语句

    oracle的分页查询可以利用rowid列。

    db2的分页查询可以利用row_number() over()聚合函数。

    mysqllimit

    access仿佛先天缺陷,仅提供了top n。那如何利用top来实现分页查询呢?

     

    假设在access有表t1

    createtable t1(

        tc1 varchar(50)notnullprimarykey,

        tc2 varchar(30),

        tc3 varchar(30)

    )

    随机插入20条数据。如果以每页5条来显示数据,如果要显示1115条如何显示?

    利用top n功能,前11条可以用以下sql完成。select top 11 tc1,tc2,tc3 from t1

    同样前15条也可以这样:select top 15 tc1,tc2,tc3 from t1

    想要得到11条到15条,估计一般都会想到差集,但access没提供差集except,可以利用notin实现。

    select top 15 tc1,tc2,tc3 from t1 where tc1 notin(select top 10 tc1 from t1)

    如果是一个比较大的表,用notin不能利用索引,使和效率极其低下,又该如何呢?

     

    可以利用左连接来解决问题

    select a.*from(select top15 tc1,tc2,tc3 from t1) a leftjoin(select top 10 tc1,tc2,tc3 from t1 ) b on a.tc1=b.tc1 where iif(b.tc1,'0','1')='1'

    这种sql的好处是显而易见的,他有效的利用了表的主键索引。当然,由于access不能这样判断b.tc1 isnull,所以要改iif(b.tc1,'0','1')='1'来曲线救国

     

     

    C#DBHelper实现方式如下

    /// <summary>

    /// 分页查询数据并返回DataTable的公共方法

    /// </summary>

    /// <param name="tableName">表名</param>

    /// <param name="field">需要查询的字段</param>

    /// <param name="pageSize">每页显示数据的条数</param>

    /// <param name="start">排除的数据量</param>

    /// <param name="sqlWhere">where条件</param>

    /// <param name="sortName">排序名称</param>

    /// <param name="sortOrder">排序方式</param>

    /// <returns></returns>

    publicstatic DataTable GetTable(String tableName, String field,int pageSize,int start, String sqlWhere, String sortName, String sortOrder,String primaryKey,out Int32 total)

    {

        //String sql = String.Format("select top {0} {1} from {2} where {7} and {6} not in (select top {3} {6} from {2} where {7} order by {4} {5}) order by {4} {5} ",

        //    pageSize, field, tableName, start, sortName, sortOrder, primaryKey, sqlWhere);

        /*上面的分页效率极低,5000条数据几乎就不动了*/

        String sql = String.Format("select a.* from ( select top {1} * from {2} where {7} order by {3} {4}) a left join ( select top {5} * from {2} where {7} order by {3} {4}) b on a.{6}=b.{6} where iif(b.{6},'0','1')='1'",

           field, start + pageSize, tableName, sortName, sortOrder, start, primaryKey, sqlWhere);

        if(start <=0)

        {

           sql = String.Format("select top {0} {1} from {2} where {3} order by {4} {5} ",

           pageSize, field, tableName, sqlWhere, sortName, sortOrder);

        }

        DataTable dt = GetTable(sql, CommandType.Text,null);

       

        sql ="select count(1) from "+tableName+" where "+ sqlWhere;

        total = Convert.ToInt32(AccessHelper.ExecuteScalar(sql, CommandType.Text,null));

       

        return dt;

    }

     

  • 相关阅读:
    不怕上不了 Android developers
    不花钱的可靠性设计
    linux2.6 内核特性配置
    Linux动态库的编译与使用 转载
    多线程使用互斥锁的C范例
    TSLIB 分析
    Notepad++中文版下载 以及HEX显示
    C程序实现在lcd 上全屏写 blue 色 及获取fb信息
    pthread_cond_wait的spurious wakeup问题
    查看linux内存条数的命令与清理内存使用
  • 原文地址:https://www.cnblogs.com/duanjt/p/4539513.html
Copyright © 2020-2023  润新知