ACCESS数据库大神指导ROW_NUMBER() OVER(ORDER BY )使用

2020-05-03 教育 82阅读

ACCESS的分页之道,Access中实现row_number() over()聚合函数功能

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

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

mysql有limit。 access仿佛先天缺陷,仅提供了top n。

那如何利用top来实现分页查询呢?


假设在access中有表t1

create table t1( tc1 varchar(50) not null primary key, tc2 varchar(30), tc3 varchar(30) )

随机插入20条数据。

如果以每页5条来显示数据,如果要显示11至15条如何显示?


利用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,可以利用not in实现。

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

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

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

select a.* from ( select top15 tc1,tc2,tc3 from t1) a left join ( 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 is null,所以要改用iif(b.tc1,'0','1')='1' 来曲线救国

声明:你问我答网所有作品(图文、音视频)均由用户自行上传分享,仅供网友学习交流。若您的权利被侵害,请联系fangmu6661024@163.com