Row Offset in SQL Server

后端 未结 16 2380
醉酒成梦
醉酒成梦 2020-11-22 05:53

Is there any way in SQL Server to get the results starting at a given offset? For example, in another type of SQL database, it\'s possible to do:

SELECT * FR         


        
相关标签:
16条回答
  • 2020-11-22 06:31

    In SqlServer2005 you can do the following:

    DECLARE @Limit INT
    DECLARE @Offset INT
    SET @Offset = 120000
    SET @Limit = 10
    
    SELECT 
        * 
    FROM
    (
       SELECT 
           row_number() 
       OVER 
          (ORDER BY column) AS rownum, column2, column3, .... columnX
       FROM   
         table
    ) AS A
    WHERE 
     A.rownum BETWEEN (@Offset) AND (@Offset + @Limit-1) 
    
    0 讨论(0)
  • 2020-11-22 06:37

    See my select for paginator

    SELECT TOP @limit * FROM (
       SELECT ROW_NUMBER() OVER (ORDER BY colunx ASC) offset, * FROM (
    
         -- YOU SELECT HERE
         SELECT * FROM mytable
    
    
       ) myquery
    ) paginator
    WHERE offset > @offset
    

    This solves the pagination ;)

    0 讨论(0)
  • 2020-11-22 06:37

    With SQL Server 2012 (11.x) and later and Azure SQL Database, you can also have "fetch_row_count_expression", you can also have ORDER BY clause along with this.

    USE AdventureWorks2012;  
    GO  
    -- Specifying variables for OFFSET and FETCH values    
    DECLARE @skip int = 0  , @take int = 8;  
    SELECT DepartmentID, Name, GroupName  
    FROM HumanResources.Department  
    ORDER BY DepartmentID ASC   
        OFFSET @skip ROWS   
        FETCH NEXT @take ROWS ONLY; 
    

    https://docs.microsoft.com/en-us/sql/t-sql/queries/select-order-by-clause-transact-sql?view=sql-server-ver15

    Note OFFSET Specifies the number of rows to skip before it starts to return rows from the query expression. It is NOT the starting row number. So, it has to be 0 to include first record.

    0 讨论(0)
  • 2020-11-22 06:38

    For tables with more and large data columns, I prefer:

    SELECT 
      tablename.col1,
      tablename.col2,
      tablename.col3,
      ...
    FROM
    (
      (
        SELECT
          col1
        FROM 
        (
          SELECT col1, ROW_NUMBER() OVER (ORDER BY col1 ASC) AS RowNum
          FROM tablename
          WHERE ([CONDITION])
        )
        AS T1 WHERE T1.RowNum BETWEEN [OFFSET] AND [OFFSET + LIMIT]
      )
      AS T2 INNER JOIN tablename ON T2.col1=tablename.col1
    );
    

    -

    [CONDITION] can contain any WHERE clause for searching.
    [OFFSET] specifies the start,
    [LIMIT] the maximum results.
    

    It has much better performance on tables with large data like BLOBs, because the ROW_NUMBER function only has to look through one column, and only the matching rows are returned with all columns.

    0 讨论(0)
提交回复
热议问题