SQL Server实现Limit语句:

MySQL有Limit语句,而SQL Server中没有。如何在SQL Server中实现类似的功能?以下方法作为参考:


(1)用TOP子句实现:

top子句的用法如下:

/*从table_表中取出前m条记录*/
/*m是从1开始的。m=1时,仅取出一条记录*/
select top m * from table_

top子句是在查询完成后才发生作用的,不是用它限定范围然后才查询。有了top子句,如何选择一定范围内的记录?例如,选择第6-10条的记录,可以先选择前5条的记录,然后选择不在这5条记录中的记录,再选择这些记录的前5条。

/*a为表名称,a.id为a表的主键*/
select top 5 * from a
where a.id not in (
   select top 5 id from a 
)

由此,选择第m到n条记录的语句为

select top (n-m+1) * from a
where a.id not in (
   select top m id from a
)

当然还可以使用where子句进行条件查询。这种方式实际上需要进行两次查询,而且需要知道查询的记录的标识列。使用起来较为麻烦。

(2)用ROW_NUMBER()加where子句实现

row_number()函数获取行号,我们可以使用where子句选择行号在一定范围内的记录。在使用row_number()的过程中需要对查询结果排序。代码如下:

/*这里按照getdate()排序,当然也可也改成按照其它顺序,如列等排序*/
SELECT * FROM
(
SELECT ROW_NUMBER()over(order by getdate()) AS rownumber,* from a
) AS #a
WHERE #a.rownum>=m AND #a.rownum<=n

在以上的语句中,选择ROW_NUMBER()(其别名为rownumber)和需要查询的内容,将其作为临时表#a,再选择rownumber在一定范围内的记录。
在这种方式下,只进行一次查询,然后在所有查询结果的临时表中选择记录。且不需要知道查询的记录的标识列。推荐使用这种方法,因为它较为简单也易于使用。
当有一个查询为select …,我们需要查询其结果的第m-n条记录时,只需要将其第一个“select”去掉,加入以下语句的相应位置即可:

SELECT * FROM
(
SELECT ROW_NUMBER()over(order by getdate()) AS rownumber,/*这里是加入去掉第一个"select"后的查询语句的地方*/
) AS #a
WHERE #a.rownum>=m AND #a.rownum<=n

更多推荐

SQL Server实现Limit语句