使用SQL Server查询语句选取前N行数据


  本文标签:SQL Server查询语句

  使用SQL Server查询语句可以实现多种查询,下面为您介绍的SQL Server查询语句可以实现选取前N行数据,希望对您能有所帮助  。

  在默认情况下,SQL Server将返回select语句所查询到的所有行  。而使用可选的top选项可以指定返回的行数  。

  Top通常与order by 配合工作,order by可以控制哪些行应当排在前面,当然,没有order by子句top也可以正常工作,不过返回的没有排序的的结果集合中的前N行数据  。

  例如我们有下面这张表:

  ID    Name    Age

  1     aa       15

  2     bb       20

  3     cc       25

  4     dd       30

  5     ee       20

  6     ff       20

  要查找年龄最小的前3个人,写如下SQL Server查询语句:

  SELECT TOP 3 *

  FROM StuList

  ORDER BY Age

  返回结果集为:

  1    aa    15

  2    bb    20

  5    ee    20

  这个SQL Server查询语句看起来很清晰,结果也不错,但是很不幸,它是错误的,因为有3个记录的年龄都是20,要解决这个问题,可以使用with ties选项  。

  对于top关键词来说,with ties选项很重要,它可以在top返回的结果之后附加多个行,这些行与top返回的结果集最后一行在order by子句指定的排序列上具有相同的值  。

  下面是修改后的代码:

  SELECT TOP 3 WITH TIES *

  FROM StuList

  ORDER BY Age

  返回结果集为:

  1    aa    15

  2    bb    20

  5    ee    20

  6    ff    20

  对照表的内容我们发现,这样的返回结果就是正确的了  。

  在select语句中必须写名top应当返回的行数量或者百分比,不能使用变量或者表达式来替代top中的数字和百分比  。

  返回限定行数的另一种方法是对rowcount全局变量进行设置,要取消rowcount的限制作用,可以将它设置为0  。

  例如:

  SET ROWCOUNT 3

  SELECT *

  FROM StuList

  ORDER BY Age

  这样也会返回3行结果,但是它没有with ties选项,所以仍然可能会生成不完整的结果  。

  注意:Top是Microsoft T-SQL 对ANSI SQL的扩展,是不可移植的  。如果必须将数据库移植到另一个数据库平台,使用top就会带来转换上的麻烦  。相反,rowcount变量是可以移植的  。