【发布时间】:2011-08-21 11:05:53
【问题描述】:
我们可以从 SQL Server 中选择Top 10 或Select Top 'N' 行。
但是有什么办法可以跳过top结果的第一行吗?
我的意思是我从select top 5 得到结果,然后我跳过第一行,只得到接下来的 4 行?
【问题讨论】:
标签: sql sql-server sql-server-2005 tsql
我们可以从 SQL Server 中选择Top 10 或Select Top 'N' 行。
但是有什么办法可以跳过top结果的第一行吗?
我的意思是我从select top 5 得到结果,然后我跳过第一行,只得到接下来的 4 行?
【问题讨论】:
标签: sql sql-server sql-server-2005 tsql
您可以使用OVER 子句和排名功能。您不能直接对此进行过滤,因此您需要使用子查询或公用表表达式,下面的示例使用后者。
DECLARE @MyTable TABLE
(
ID INT,
Name VARCHAR(15)
);
INSERT INTO @MyTable VALUES (1, 'Alice');
INSERT INTO @MyTable VALUES (2, 'Bob');
INSERT INTO @MyTable VALUES (3, 'Chris');
INSERT INTO @MyTable VALUES (4, 'David');
INSERT INTO @MyTable VALUES (5, 'Edgar');
WITH people AS
(
SELECT ID, Name, ROW_NUMBER() OVER (ORDER BY ID) RN
FROM @MyTable
)
SELECT ID, Name
FROM people
WHERE RN > 1;
在 SQL Server 的下一版本(代号 Denali)中将更好地支持带有 OFFSET 和 FETCH 关键字的分页。
【讨论】:
你可以这样做:
SELECT
*
FROM (
SELECT
row_number() OVER (ORDER BY ID DESC) AS [rownum],
*
FROM
tbl
) T
WHERE
rownum BETWEEN (2) AND (5)
更新:
更新为您的价值观。
更新 2:
更正了缺少子查询的错误。感谢 Chris Diver 指出这一点。
【讨论】:
;WITH... 解决方案不起作用。
您正在寻找的是术语分页。 像这样:http://www.15seconds.com/issue/070628.htm
【讨论】:
类似这样的:
-- Test table
declare @T table(ID int);
-- Add test data
insert into @T
select 1 union all
select 2 union all
select 3 union all
select 4 union all
select 5 union all
select 6;
-- Query using row_number() over(...)
-- to get rows 2 - 5
select T.ID
from (
select *,
row_number() over(order by ID) as rn
from @T
) as T
where T.rn between 2 and 5;
【讨论】: