从SQL Server数据库中选择任何范围的记录

时间:2018-03-22 07:53:18

标签: sql sql-server

我正在尝试仅显示数据库中选定数量的行(例如从20到45)我正在尝试使用限制但它无法正常工作

Select * 
from UsersTable 
limit 20,45

这是错误的,因为SQL Server不允许此功能。

我找到的答案是

SELECT * 
FROM 
    (SELECT 
         *, ROW_NUMBER() OVER (ORDER BY name) AS row 
     FROM 
         sys.databases) a 
WHERE 
    row > 20 and row <= 45

有人可以简化这个吗?我无法按照上述查询,其中(ORDER BY name)是什么

假设我的数据库中包含Id, UserName, Email列,Id列中的值将类似于1, 2, 4, 8, 11, 17 - &gt;不是连续的值

2 个答案:

答案 0 :(得分:3)

在SQL-Server 2012及更高版本中,您可以使用以下OFFSETFETCH

SELECT *
FROM tbl
ORDER BY name
OFFSET 20 ROWS 
FETCH NEXT 25 ROWS ONLY 

在旧版本中,您必须使用以下ROW_NUMBER()

SELECT * 
FROM ( 
    SELECT *, ROW_NUMBER() OVER (ORDER BY name) as rn 
    FROM tbl
 ) x 
 WHERE rn > 20 and rn <= 45

答案 1 :(得分:1)

ORDER BY name调用中的ROW_NUMBER子句是用于分配行号的排序逻辑。请考虑以下数据和相应的行号:

name | row
Abby | 1
Bob  | 2
...  | ...
Jack | 20
John | 21
...  | ...
Mike | 45

您可以将别名为a的子查询可视化为上述中间表。然后,在行&gt;的条件下子查询a 20和行&lt; 45.在上表中,这意味着您将保留从John到包含Mike的记录。

SQL Server的更高版本也支持OFFSETFETCH,但您应该学习如何使用ROW_NUMBER,也许是最基本的分析函数,因为它可能会再次出现在你未来的工作。

您的完整查询:

SELECT *
FROM 
(
    -- this subquery corresponds to the table given above
    SELECT *, ROW_NUMBER() OVER (ORDER BY name) AS row 
    FROM sys.databases
) a 
-- now retain only records with row > 20 and row <= 45
WHERE 
    row > 20 AND row <= 45;