我正在尝试仅显示数据库中选定数量的行(例如从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;不是连续的值
答案 0 :(得分:3)
在SQL-Server 2012及更高版本中,您可以使用以下OFFSET
和FETCH
:
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的更高版本也支持OFFSET
和FETCH
,但您应该学习如何使用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;