【问题标题】:To select any range of records from SQL Server database [duplicate]从 SQL Server 数据库中选择任何范围的记录[重复]
【发布时间】:2018-08-31 13:43:13
【问题描述】:

我正在尝试仅显示数据库中选定的行数(例如从 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 -> 不是连续值

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    在 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
    

    【讨论】:

      【解决方案2】:

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

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

      您可以将别名为a 的子查询可视化为上述中间表。然后,您在行 > 20 和行 a 进行子查询。在上表中,这意味着您将保留从 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;
      

      【讨论】:

      • 你能写出查询,以便我更好地理解
      • 你是最棒的,谢谢你!!!!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多