(
select RowNumber=row_number() over(order by id),* from 表名
)
select * from cte where RowNumber between 10 and 20
这是查10到20行的
第M条到第N条?呵呵,顺序显示你是排好的,但M<N吧?不管是谁大小,你极可能是使用在分页程序中,又不想对数据库进行全读,对吧?但在ASP中这样做意义不大。比如你是以一个列名为id的进行升序排序的话可以考虑使用以下方式:
读取第M条到第N条(M 〈N)
select top (m-n+1) * from tablename where id in (select top n id from table [where 条件‘如果没有条件可省略]order by id DESC) order by id ASC
这个是利用子查询进行一种方式。一般先取出前N条,然后在前N条中取出后M条,但我们没有办法取出后M条,但还好有办法取出前M条,其实这之间的差别就是顺序巅倒一下就可得到相应的数据了!
但一个子查询与主查询都是挺橇时的。一般用于分页查询中。
比如对一个数据库进行一次分页查询,若是使用常规的分页查询肯定是:
先进行一次查询,然后计算其具体的页数,根据页数的不同,比如页是2时,对于结果进行一次rs.move page*pagesize,到达相应的页数后再进行依次取值,这样做的缺陷是每次都是一个完整的数据库,如果分页过多(也就是数据量大时)很橇时。所以我们在想是不是从数据库取出时构造特定的SQL语句只取出本页的内容?比如我想取出第二页的记录,SQL语句进行这样的构造:
子查询取出前2页的内容,然后再在子查询中取出后一页的内容,也就是第二页的内容。基于这种想法去构造SQL,比如想取出第21条到第40条的内容,当然是每页显示20条计录时,可以考虑使用这种方式。
但说到最后一页,先取出的也是所以的,然后取出到(前一页码)*页容量+1到结尾的数据,虽说子查询有一次也是对全局数据记录或是几乎全局记录的索引,但这些都是交由数据服务器进行的。而不用再交给ASP进行处理。从而节省了分页的时间。所以一般情况只是对其进行一个子查询的嵌套就可以完成任务了!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)