access中left join和limit联合分页查询怎么写sql语句

access中left join和limit联合分页查询怎么写sql语句,第1张

选择astudentname,azhengpic,bgetbookdate的BookInfo为B,BOOKTYPE的作为,aid = bstudentid bid = cid作为一个从studentinfo,

不用储存过程也可以,可以把分页的逻辑分别写几个按钮事件。比如10条数据/页,你先查询数据库一共多少条数据,然后计算页数赋给aspnetpager。然后每次用sql拼接查询就行了示例select top 10 uid,uname from userinfo where uid not in (select top 10你当前的页数 uid from userinfo)

MYSQL 分页最简单了 SELECT FROM Account WHERE (usertype='base' or usertype='home' or usertype='salse') and logindate is not null order by logindate desc LIMIT 起始行, 每页多少行 LIMIT 接受一个或两个数字参数。参数必须是一个整数常量。如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。初始记录行的偏移量是 0(而不是 1)

sql语句如下:

分页1

SELECT

FROM (Select ROWNUM AS ROWNO, T

    from 表名 T(别名)

   where 表字段 between to_date('20060501', 'yyyymmdd') and  to_date('20060731', 'yyyymmdd')

    AND ROWNUM <= 20) TABLE_ALIAS

WHERE TABLE_ALIASROWNO >= 10;

经过测试,此方法成本最低,只嵌套一层,速度最快,即使查询的数据量再大,也几乎不受影响,速度依然

分页2:

SELECT

FROM (SELECT TT, ROWNUM AS ROWNO

    FROM (Select t

        from 表名 T(别名)

        where flight_date between to_date('20060501', 'yyyymmdd') and

           to_date('20060531', 'yyyymmdd')

        ORDER BY FACT_UP_TIME, flight_no) TT(别名二)

   WHERE ROWNUM <= 20) TABLE_ALIAS

where TABLE_ALIASrowno >= 10;

经过测试,此方法随着查询范围的扩大,速度也会越来越慢,

 

最简单的ASP分页代码

<%

set conn=servercreateobject("adodbconnection")

connopen("DRIVER=Driver do Microsoft Access (mdb);UID=admin;pwd=;dbq="&servermappath("1mdb"))

set rs=servercreateobject("adodbrecordset")

sql="select from student"

rsopen sql,conn,3

rspagesize=20

if request("page")<>"" then

epage=cint(request("page"))

if epage<1 then epage=1

if epage>rspagecount then epage=rspagecount

else

epage=1

end if

rsabsolutepage=epage

%>

<table border="0" cellpadding="0" cellspacing="1" bgcolor="#0000FF" width="80%" align="center">

<tr bgcolor="#FFFFFF" align="center">

<th><%=rs(0)name%></th><th><%=rs(1)name%></th><th><%=rs(2)name%></th>

</tr>

<%

for i=0 to rspagesize-1

if rsbof or rseof then exit for

%>

<tr bgcolor="#FFFFFF" align="center">

<td><%=rs(0)value%></td><td><%=rs(1)value%></td><td><%=rs(2)value%></td>

</tr>

<%

rsmovenext()

next

%>

</table>

<p align="center">

<a href="">首页</a>

<a href="indexasppage=<%=epage-1%>">前一页</a>

<a href="indexasppage=<%=epage+1%>">后一页</a>

<a href="indexasppage=<%=rspagecount%>">末页</a>

</p>

<p align="center">现在是第<%=epage%>页一共有<%=rspagecount%>页</p>

<%

connclose()

%>

DataGrid是一个功能非常强大的ASPnet Web服务器端控件,它除了能够方便地按各种方式格式化显示表格中的数据,还可以对表格中的数据进行动态的排序、编辑和分页。使Web开发人员从繁琐的代码中解放。实现DataGrid的分页功能一直是很多初学ASPNET的人感到棘手的问题,特别是自定义分页功能,实现方法多种多样,非常灵活。本文将向大家介绍一种DataGird控件在Access数据库下的快速分页法,帮助初学者掌握DataGrid的分页技术。

目前的分页方法

DataGrid内建的分页方法是使用诸如“SELECT FROM <TABLE>”的SQL语句从数据库表中取出所有的记录到DataSet中,DataGrid控件绑定到该DataSet之后,它的自动分页功能会帮你从该DataSet中筛选出当前分页的数据并显示出来,其他没有用的数据将被丢弃。

还有一种方法是使用自定义分页功能,先将DataGrid的AllowCustomPaging属性设置为True,再利用DataAdapter的Fill方法将数据的筛选工作提前到填充DataSet时,而不是让DataGrid帮你筛选:

public int Fill (

DataSet dataSet, //要填充的 DataSet。

int startRecord, //从其开始的从零开始的记录号。

int maxRecords, //要检索的最大记录数。

string srcTable //用于表映射的源表的名称。

);

该方法首先将来自查询处的结果填充到DataSet中,再将不需要显示的数据丢弃。当然,自定义分页功能需要完成的事情还不止这些,本文将在后面详细介绍。

以上两种方法的工作原理都是先从数据库中取出所有的记录,然后筛选出有用的数据显示出来。可见,两种方法的效率基本上是一致的,因为它们在数据访问阶段并没有采取有效的措施来减少Access对磁盘的访问次数。对于小数量的记录,这种开销可能是比较小的,如果针对大量数据的分页,开销将会非常巨大,从而导致分页的速度非常的慢。换句话说,就算每个DataGrid分页面要显示的数据只是一个拥有几万条记录的数据库表的其中10条,每次DataGrid进行分页时还是要从该表中取出所有的记录。

很多人已经意识到了这个问题,并提出了解决方法:用自定义分页,每次只从数据库中取出要显示的数据。这样,我们需要在SQL语句上下功夫了。由于Access不支持真正的存储过程,在编写分页算法上就没有SQL Server那么自由了。SQL Server可以在存储过程中利用临时表来实现高效率的分页算法,受到了广泛的采用。而对于Access,我们必须想办法在一条SQL语句内实现最高效的算法。

用一条SQL语句取得某段数据的方法有好几种。算法不同,效率也就不同。我经过粗略的测试,发现效率最差的SQL语句执行时耗费的时间大概是效率最高的SQL语句的3倍!而且这个数值会随着记录总数的增加而增加。下面将介绍其中两条常用的SQL语句。

为了方便接下来的讨论,我们先约定如下:

变量 说明 变量 说明

@PageSize 每页显示的记录总数 @MiddleIndex 中间页的索引

@PageCount 分页总数 @LastIndex 最后一页的索引

@RecordCount 数据表的记录总数 @TableName 数据库表名称

@PageIndex 当前页的索引 @PrimaryKey 主键字段名称

@FirstIndex 第一页的索引 @QueryFields 要查询的字段集

变量 定义

@PageCount (int)MathCeiling((double)@RecordCount / @PageSize)

@FirstIndex 0

@LastIndex @PageCount – 1

@MiddleIndex (int)MathCeiling((double)@PageCount / 2) – 1

先让我们看看效率最差的SQL语句:

SELECT TOP @PageSize FROM @TableName

WHERE @PrimaryKey NOT IN (

SELECT TOP @PageSize@PageIndex @PrimaryKey FROM @TableName

ORDER BY @PrimaryKey ASC

) ORDER BY @PrimaryKey ASC

这条SQL语句慢就慢在NOT IN这里,主SELECT语句遍历的每个@PrimaryKey的值都要跟子SELECT语句的结果集中的每一个@PrimaryKey的值进行比较,这样时间复杂度非常大。这里不得不提醒一下大家,平时编写SQL语句时应该尽量避免使用NOT IN语句,因为它往往会增加整个SQL语句的时间复杂度。

另一种是使用了两个TOP和三个ORDER BY的SQL语句,如下所示:

SELECT FROM (

SELECT TOP @PageSize FROM (

SELECT TOP @PageSize(@PageIndex+1) FROM @TableName

ORDER BY @PrimaryKey ASC

) TableA ORDER BY @PrimaryKey DESC

) TableB ORDER BY @PrimaryKey ASC

这条SQL语句空间复杂度比较大。如果要显示的分页面刚好是最后一页,那么它的效率比直接SELECT出所有的记录还要低。因此,对于分页算法,我们还应该具体情况具体分析,不能一概而论。下面将简单介绍一下相关概念,如果您对主键和索引非常熟悉,可以直接跳过。

以上就是关于access中left join和limit联合分页查询怎么写sql语句全部的内容,包括:access中left join和limit联合分页查询怎么写sql语句、如何使用ACESS数据库在Asp.net中分页、mysql 数据库 分表后 怎么进行分页查询等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/10200621.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-06
下一篇 2023-05-06

发表评论

登录后才能评论

评论列表(0条)

保存