SQL Server中与mysql limit x, y等效的是什么?

3

我需要在网页上编写分页代码,通常使用mysql可以简单地使用SELECT with LIMIT 60, 20来选择从第60个位置开始的20行。

现在我正在使用SQL Server,但需要解决这个问题 - 我知道TOP语法不适用,我也听说过SQL Server中的ROW_NUMBER()函数,但我找到的示例不够清晰 - 请帮助我在测试表“cars”上简单地实现。

select * from cars limit 20, 10

可能是MS SQL Server中的行偏移的重复问题。 - Andriy M
请参见:https://dev59.com/KHVC5IYBdhLWcg3wrDNd。 - Bill Karwin
4个回答

3

ROW_NUMBER()不能在where子句中使用,所以您必须使用单独的select语句:

select *
from (select row_number() over (ORDER BY cars.CarId) as Row, *
    from cars
    ) temp
where Row between 20 and 29

是的,这就是我在过去一小时里一直在寻找的 - 谢谢,伙计。非常实用。 - Arthur Kushman

1
SQL Server 2005引入了新的ROW_NUMBER()函数,使分页任务更加容易。要实现像之前的示例中那样的分页,从Country列为'Spain'的Customers表中获取第三页,每页10条记录,并按CompanyName排序,存储过程将如下所示:
CREATE PROCEDURE Paging_Customers
(
  @SelectedPage int,
  @PageSize int
)
AS
BEGIN
  WITH CTE_Customers(PageNumber, ContactTitle, ContactName, CompanyName, Phone, Country)
  AS
  (
  SELECT CEILING((ROW_NUMBER() OVER
  (ORDER BY CompanyName ASC
  AS PageNumber, ContactTitle, ContactName, CompanyName, Phone, Country
  FROM Customers
  )

SELECT *
FROM CTE_Customers WHERE PageNumber = @SelectedPage
END

然后,我们使用这一简单行调用该过程(对于第三页和每页十行):

EXEC Paging_Customers 3, 10

谢谢,但我需要一个更简单的解决方案,不需要使用PROCEDURE,就像我在汽车表格示例中所要求的那样,因为我将根据不同的流程设置不同的值和where子句等。 - Arthur Kushman
与MySQL不同,SQL Server不支持LIMIT子句,而且对于分页,您必须使用ROW_NUMBER、临时表或三个嵌套查询之一。而且,这些方法都不像MySQL中的limit语句那样简单。 - sudheshna
@sudheshna - 你的存储过程中没有使用@PageSize。当从大结果集中获取小页面时,这样做的性能如何? - Will A

0
-- Sample data
;with cars(Name) as
(
  select 'SAAB' union all
  select 'Volvo' union all
  select 'Opel' union all
  select 'Ford'
)  

-- Query using row_number
select *
from 
  (
   select *,
          row_number() over(order by Name) as rn
   from cars
  ) as C
where C.rn between 2 and 3   

结果:

Name  rn
----  --
Opel  2
SAAB  3

0

试试这个:

SELECT * FROM 
    (SELECT *, ROW_NUMBER() OVER (ORDER BY col1) AS row FROM sys.databases) table1 
WHERE row > 20 and row <= 30

在SO上提供了更多答案这里


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接