복붙노트

[SQL] SQL 서버에서 오프셋 행

SQL

SQL 서버에서 오프셋 행

A는 지정된 오프셋 (offset) 시작하는 결과를 얻을 수있는 SQL Server의 방법이 있습니까? 예를 들어, SQL 데이터베이스의 또 다른 유형, 그것은 할 수있다 :

SELECT * FROM MyTable OFFSET 50 LIMIT 25

결과 51-75를 얻을 수 있습니다. 이 구조는 SQL 서버에 존재하는 표시되지 않습니다.

어떻게이 나는 걱정하지 않는다 모든 행을로드하지 않고 달성 할 수 있습니까? 감사!

해결법

  1. ==============================

    1.나는 SELECT *를 사용하지 않는 것입니다. 당신이 실제로 그들 모두 할 수있다하더라도 원하는 열을 지정합니다.

    나는 SELECT *를 사용하지 않는 것입니다. 당신이 실제로 그들 모두 할 수있다하더라도 원하는 열을 지정합니다.

    SQL 서버 2005 +

    SELECT col1, col2 
    FROM (
        SELECT col1, col2, ROW_NUMBER() OVER (ORDER BY ID) AS RowNum
        FROM MyTable
    ) AS MyDerivedTable
    WHERE MyDerivedTable.RowNum BETWEEN @startRow AND @endRow
    

    SQL Server 2000의

    효율적으로 SQL 서버 2000에서 대형 결과 세트를 통해 페이징

    대형 결과 세트를 통해 페이징을위한보다 효율적인 방법

  2. ==============================

    2.당신은 단순히 이전 페이지에서 볼 수있는 마지막 키 값을 기억하고 TOP (25) ... 사용하여 다음 순서에있는 모든 페이지를 처리 ​​할 경우 WHERE 키> 적합한 인덱스가 허용 존재하는 경우 ORDER BY 키는 실적이 가장 좋은 방법이 될 수 있습니다 @last_key 이 효율적으로 탐색했습니다합니다 -하거나하지 않으면 커서 API를.

    당신은 단순히 이전 페이지에서 볼 수있는 마지막 키 값을 기억하고 TOP (25) ... 사용하여 다음 순서에있는 모든 페이지를 처리 ​​할 경우 WHERE 키> 적합한 인덱스가 허용 존재하는 경우 ORDER BY 키는 실적이 가장 좋은 방법이 될 수 있습니다 @last_key 이 효율적으로 탐색했습니다합니다 -하거나하지 않으면 커서 API를.

    2008 R2 아마 ROW_NUMBER와 사이 - 임의의 페이지를 SQL Server에 대한 최상의 솔루션 2005을 선택

    SQL Server의 경우 2012+이 필요에 대한 BY 절 개선 ORDER를 사용할 수 있습니다.

    SELECT  *
    FROM     MyTable 
    ORDER BY OrderingColumn ASC 
    OFFSET  50 ROWS 
    FETCH NEXT 25 ROWS ONLY 
    

    는 미지수지만 수행이 옵션을 얼마나 잘 될 것입니다.

  3. ==============================

    3.이것은 하나의 방법입니다 (SQL2000)

    이것은 하나의 방법입니다 (SQL2000)

    SELECT * FROM
    (
        SELECT TOP (@pageSize) * FROM
        (
            SELECT TOP (@pageNumber * @pageSize) *
            FROM tableName 
            ORDER BY columnName ASC
        ) AS t1 
        ORDER BY columnName DESC
    ) AS t2 
    ORDER BY columnName ASC
    

    이것은 (2005 SQL) 또 다른 방법입니다

    ;WITH results AS (
        SELECT 
            rowNo = ROW_NUMBER() OVER( ORDER BY columnName ASC )
            , *
        FROM tableName 
    ) 
    SELECT * 
    FROM results
    WHERE rowNo between (@pageNumber-1)*@pageSize+1 and @pageNumber*@pageSize
    
  4. ==============================

    4.당신은 당신이 원하는 것을 얻을 ROW_NUMBER () 함수를 사용할 수 있습니다 :

    당신은 당신이 원하는 것을 얻을 ROW_NUMBER () 함수를 사용할 수 있습니다 :

    SELECT *
    FROM (SELECT ROW_NUMBER() OVER(ORDER BY id) RowNr, id FROM tbl) t
    WHERE RowNr BETWEEN 10 AND 20
    
  5. ==============================

    5.이 SQL 서버 2012 FETCH ... OFFSET되어 있지만 열에 의해 순서를 지정해야합니다.

    이 SQL 서버 2012 FETCH ... OFFSET되어 있지만 열에 의해 순서를 지정해야합니다.

    당신이 정말로 (다른 제안으로) 당신이 열 BY 순서로 전달할 수 있음을 명시 적 열이없는 경우에, 당신은이 트릭을 사용할 수 있습니다 :

    SELECT * FROM MyTable 
    ORDER BY @@VERSION 
    OFFSET 50 ROWS FETCH NEXT 25 ROWS ONLY
    

    ... 또는

    SELECT * FROM MyTable 
    ORDER BY (SELECT 0)
    OFFSET 50 ROWS FETCH NEXT 25 ROWS ONLY
    

    사용자가 명시 적으로 순서를 지정하지 않을 때 우리는 jOOQ에서 그것을 사용하고 있습니다. 이 후 추가 비용없이 꽤 임의 순서를 생성합니다.

  6. ==============================

    6.더 큰 데이터 열이있는 테이블의 경우, 내가 선호 :

    더 큰 데이터 열이있는 테이블의 경우, 내가 선호 :

    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.
    

    ROW_NUMBER 함수가 하나 개의 칼럼을 통해보고있다, 만 일치하는 행이 모든 열이 반환되어 있기 때문에, BLOB를 같은 대용량 데이터가있는 테이블에 훨씬 더 나은 성능을 가지고있다.

  7. ==============================

    7.매기기위한 나의 선택을 참조

    매기기위한 나의 선택을 참조

    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
    

    이것은 페이징 해결)

  8. ==============================

    8.

    SELECT TOP 75 * FROM MyTable
    EXCEPT 
    SELECT TOP 50 * FROM MyTable
    
  9. ==============================

    9.버전에 따라 당신이 직접 할 수는 없지만 같은 해키 뭔가를 할 수

    버전에 따라 당신이 직접 할 수는 없지만 같은 해키 뭔가를 할 수

    select top 25 *
    from ( 
      select top 75 *
      from   table 
      order by field asc
    ) a 
    order by field desc 
    

    여기서 '필드'의 핵심입니다.

  10. ==============================

    10.SQL 서버 2012 년 처음 50 기록의 작품을 제외하고 25 개 레코드를 표시합니다 다음.

    SQL 서버 2012 년 처음 50 기록의 작품을 제외하고 25 개 레코드를 표시합니다 다음.

    SELECT * FROM MyTable ORDER BY ID OFFSET 50 ROWS FETCH NEXT 25 ROWS ONLY;
    

    당신은 당신의 필요 조건으로 ID를 대체 할 수

  11. ==============================

    11.성능이 매우 가난으로 ROW_NUMBER () OVER (주문 BY) 문을 사용할 때주의해야합니다. 같은 더 악화입니다) ROW_NUMBER와 공통 테이블 식을 (사용 간다. 나는 빠른 페이지 번호를 제공하기 위해 신원과 테이블 변수를 사용하는 것보다 약간 것으로 입증되었습니다 다음 코드를 사용하고 있습니다.

    성능이 매우 가난으로 ROW_NUMBER () OVER (주문 BY) 문을 사용할 때주의해야합니다. 같은 더 악화입니다) ROW_NUMBER와 공통 테이블 식을 (사용 간다. 나는 빠른 페이지 번호를 제공하기 위해 신원과 테이블 변수를 사용하는 것보다 약간 것으로 입증되었습니다 다음 코드를 사용하고 있습니다.

    DECLARE @Offset INT = 120000
    DECLARE @Limit INT = 10
    
    DECLARE @ROWCOUNT INT = @Offset+@Limit
    SET ROWCOUNT @ROWCOUNT
    
    SELECT * FROM MyTable INTO #ResultSet
    WHERE MyTable.Type = 1
    
    SELECT * FROM
    (
        SELECT *, ROW_NUMBER() OVER(ORDER BY SortConst ASC) As RowNumber FROM
        (
            SELECT *, 1 As SortConst FROM #ResultSet
        ) AS ResultSet
    ) AS Page
    WHERE RowNumber BETWEEN @Offset AND @ROWCOUNT
    
    DROP TABLE #ResultSet
    
  12. ==============================

    12.나는 페이지 매기기에이 기술을 사용합니다. 나는 모든 행을 가져 오지 않습니다. 내 페이지 상단 100 행을 표시 할 필요가있는 경우 예를 들어, 나는 where 절에서만 100를 가져옵니다. 는 SQL의 출력은 고유 키가 있어야합니다.

    나는 페이지 매기기에이 기술을 사용합니다. 나는 모든 행을 가져 오지 않습니다. 내 페이지 상단 100 행을 표시 할 필요가있는 경우 예를 들어, 나는 where 절에서만 100를 가져옵니다. 는 SQL의 출력은 고유 키가 있어야합니다.

    표는 다음이 있습니다 :

    ID, KeyId, Rank
    

    같은 순위는 하나 이상의 -a Keyid 키 ID에 할당됩니다.

    SQL은 표에서 선택 상위 2 * 여기서 순위> = @Rank 및 ID> @Id

    처음으로 나는 모두 0을 전달합니다. 두번째는 .... 1 및 제 3 시간은 2 및 6을 통과 통과

    10 기록 순위 & ID의 값은 다음에 전달

    11  21  1
    14  22  1
    7   11  1
    6   19  2
    12  31  2
    13  18  2
    

    이 시스템에 최소한의 스트레스를해야합니다

  13. ==============================

    13.는 SQL Server 2005에서는 다음을 수행 할 수 있습니다 :

    는 SQL Server 2005에서는 다음을 수행 할 수 있습니다 :

    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) 
    
  14. ==============================

    14.주문 기록에 시간을 낭비하지 않고 그것을 할 수있는 가장 좋은 방법은 다음과 같이이다 :

    주문 기록에 시간을 낭비하지 않고 그것을 할 수있는 가장 좋은 방법은 다음과 같이이다 :

    select 0 as tmp,Column1 from Table1 Order by tmp OFFSET 5000000 ROWS FETCH NEXT 50 ROWS ONLY
    

    그것은 1 초 미만 걸립니다! 큰 테이블을위한 최고의 솔루션입니다.

  15. ==============================

    15.나는 (일반 쿼리) 잠시 지금이 응답에 대한 검색 및 2000 + SQL Server에서 그 일을 ROWCOUNT 및 커서와 TOP 또는 임시 테이블없이 사용의 또 다른 방법을 발견했습니다.

    나는 (일반 쿼리) 잠시 지금이 응답에 대한 검색 및 2000 + SQL Server에서 그 일을 ROWCOUNT 및 커서와 TOP 또는 임시 테이블없이 사용의 또 다른 방법을 발견했습니다.

    [+ LIMIT OFFSET] 다음 SET ROWCOUNT를 사용하면 결과를 제한 할 수 있고, 커서, 당신이 원하는 행, 마지막까지 다음 루프 '로 바로 이동합니다.

    쿼리는 다음과 같이 될 것이다 그래서 :

    SET ROWCOUNT 75 -- (50 + 25)
    DECLARE MyCursor SCROLL CURSOR FOR SELECT * FROM pessoas
    OPEN MyCursor
    FETCH ABSOLUTE 50 FROM MyCursor -- OFFSET
    WHILE @@FETCH_STATUS = 0 BEGIN
        FETCH next FROM MyCursor
    END
    CLOSE MyCursor
    DEALLOCATE MyCursor
    SET ROWCOUNT 0
    
  16. from https://stackoverflow.com/questions/187998/row-offset-in-sql-server by cc-by-sa and MIT license