在PostgreSQL中,有Limit和Offset关键字,可以非常容易地对结果集进行分页。

SQL Server的等效语法是什么?


当前回答

这里有人在sql 2011中讲述了这个功能,令人遗憾的是,他们选择了一个有点不同的关键字“OFFSET / FETCH”,但它不是标准的,然后ok。

其他回答

您可以在公共表表达式中使用ROW_NUMBER来实现这一点。

;WITH My_CTE AS
(
     SELECT
          col1,
          col2,
          ROW_NUMBER() OVER(ORDER BY col1) AS row_number
     FROM
          My_Table
     WHERE
          <<<whatever>>>
)
SELECT
     col1,
     col2
FROM
     My_CTE
WHERE
     row_number BETWEEN @start_row AND @end_row

因为还没有人提供这个代码:

SELECT TOP @limit f1, f2, f3...
FROM t1
WHERE c1 = v1, c2 > v2...
AND
    t1.id NOT IN
        (SELECT TOP @offset id
         FROM t1
         WHERE c1 = v1, c2 > v2...
         ORDER BY o1, o2...)
ORDER BY o1, o2...

重要的几点:

ORDER BY必须相同 @limit可以替换为检索结果的数量, @offset是要跳过的结果数 请将性能与以前的解决方案进行比较,因为它们可能更有效 这个解决方案重复了where和order by子句,如果它们不同步,将提供不正确的结果 另一方面,如果需要的话,order by是明确存在的

我假设,在c#表达式/LINQ语句的跳过和采取生成下面的SQL命令

DECLARE @p0 Int = 1
DECLARE @p1 Int = 3
SELECT [t1].[Id]
FROM (
    SELECT ROW_NUMBER() OVER (ORDER BY [t0].[Id]
    FROM [ShoppingCart] AS [t0]
    ) AS [t1]
WHERE [t1].[ROW_NUMBER] BETWEEN @p0 + 1 AND @p0 + @p1
ORDER BY [t1].[ROW_NUMBER]

我能做到的最接近

select * FROM( SELECT *, ROW_NUMBER() over (ORDER BY ID ) as ct from [db].[dbo].[table] ) sub where ct > fromNumber  and ct <= toNumber

我猜类似于select * from [db].[dbo]。[table] LIMIT 0,10

在SQL server中,你可以使用TOP和ROW_NUMBER()