복붙노트

[SQL] LIMIT의 등가 및 SQL Server에 대한 OFFSET?

SQL

LIMIT의 등가 및 SQL Server에 대한 OFFSET?

PostgreSQL의에서 결과 집합의 매우 쉽게 매김을 허용 할 제한 및 오프셋 키워드가있다.

SQL Server의 해당하는 구문은 무엇입니까?

해결법

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

    1.LIMIT의 상당 SET ROWCOUNT이지만 일반적인 매김을 할 경우이 같은 쿼리를 작성하는 것이 좋습니다 :

    LIMIT의 상당 SET ROWCOUNT이지만 일반적인 매김을 할 경우이 같은 쿼리를 작성하는 것이 좋습니다 :

    ;WITH Results_CTE AS
    (
        SELECT
            Col1, Col2, ...,
            ROW_NUMBER() OVER (ORDER BY SortCol1, SortCol2, ...) AS RowNum
        FROM Table
        WHERE <whatever>
    )
    SELECT *
    FROM Results_CTE
    WHERE RowNum >= @Offset
    AND RowNum < @Offset + @Limit
    

    여기 장점은 페이징 옵션을 변경 (또는 사용자가 이러한 행위를하도록 허용)하기로 결정하는 경우의 오프셋 및 제한의 파라미터이다.

    참고 : @Offset 매개 변수는 정상 제로 인덱스보다이 아니라 하나 기반의 인덱싱을 사용해야합니다.

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

    2.이 기능은 현재 SQL 서버 2012에 쉽게 이루어진다. 이것은 이후 SQL 서버 2012에서 노력하고 있습니다.

    이 기능은 현재 SQL 서버 2012에 쉽게 이루어진다. 이것은 이후 SQL 서버 2012에서 노력하고 있습니다.

    SQL Server의 11-20 행을 선택하는 오프셋으로 제한 :

    SELECT email FROM emailTable 
    WHERE user_id=3
    ORDER BY Id
    OFFSET 10 ROWS
    FETCH NEXT 10 ROWS ONLY;
    

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

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

    3.

    select top {LIMIT HERE} * from (
          select *, ROW_NUMBER() over (order by {ORDER FIELD}) as r_n_n 
          from {YOUR TABLES} where {OTHER OPTIONAL FILTERS}
    ) xx where r_n_n >={OFFSET HERE}
    

    노트: ROW_NUMBER () 구현했을 때이 때부터이 솔루션은, SQL Server 2005 또는 이상에서 작동합니다.

  4. ==============================

    4.이를 달성하기 위해 공통 테이블 표현식에서 ROW_NUMBER를 사용할 수 있습니다.

    이를 달성하기 위해 공통 테이블 표현식에서 ROW_NUMBER를 사용할 수 있습니다.

    ;WITH My_CTE AS
    (
         SELECT
              col1,
              col2,
              ROW_NUMBER() OVER(ORDER BY col1) AS row_number
         FROM
              My_Table
         WHERE
              <<<whatever>>>
    )
    SELECT
         col1,
         col2
    FROM
         My_CTE
    WHERE
         row_number BETWEEN @start_row AND @end_row
    
  5. ==============================

    5.의 나를 위해 사용 나는 TOP의 조합을 사용 (빠른이었다)이 같은 오프셋 때문에, 느렸다 함께 OFFSET 및 FETCH :

    의 나를 위해 사용 나는 TOP의 조합을 사용 (빠른이었다)이 같은 오프셋 때문에, 느렸다 함께 OFFSET 및 FETCH :

    SELECT TOP 20 * FROM (SELECT columname1, columname2 FROM tablename
        WHERE <conditions...> ORDER BY columname1 OFFSET 100 ROWS) aliasname
    

    참고 : TOP을 사용하고 같은 동일한 쿼리에 함께 OFFSET 경우 :

    SELECT TOP 20 columname1, columname2 FROM tablename
        WHERE <conditions...> ORDER BY columname1 OFFSET 100 ROWS
    

    그럼 당신은 그렇게 사용 TOP 들어, 오류가 발생하고 하위 쿼리를 분리 할 필요가 함께 OFFSET.

    당신이 DISTINCT 사용을 선택해야하는 경우 다음 쿼리는 같다 :

    SELECT TOP 20 FROM (SELECT DISTINCT columname1, columname2
        WHERE <conditions...> ORDER BY columname1 OFFSET 100 ROWS) aliasname
    

    참고 : DISTINCT와 SELECT ROW_NUMBER의 사용은 나를 위해 작동하지 않았다.

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

    6.또 다른 샘플 :

    또 다른 샘플 :

    declare @limit int 
    declare @offset int 
    set @offset = 2;
    set @limit = 20;
    declare @count int
    declare @idxini int 
    declare @idxfim int 
    select @idxfim = @offset * @limit
    select @idxini = @idxfim - (@limit-1);
    WITH paging AS
        (
            SELECT 
                 ROW_NUMBER() OVER (order by object_id) AS rowid, *
            FROM 
                sys.objects 
        )
    select *
        from 
            (select COUNT(1) as rowqtd from paging) qtd, 
                paging 
        where 
            rowid between @idxini and @idxfim
        order by 
            rowid;
    
  7. ==============================

    7.이 SQL 2011 년 기능, 슬픈 그들은 "FETCH / OFFSET"조금 다른 키워드를 선택는하지만 STANDART 한 다음 확인을하지 대한 사람의 이야기가 여기에있다.

    이 SQL 2011 년 기능, 슬픈 그들은 "FETCH / OFFSET"조금 다른 키워드를 선택는하지만 STANDART 한 다음 확인을하지 대한 사람의 이야기가 여기에있다.

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

    8.약간의 Aaronaught의 솔루션에 대한 변화, 나는 일반적으로 변수화 페이지 번호 (@PageNum) 및 페이지 크기 (@PageSize를) 추가. 각 페이지의 클릭 이벤트는 단지 구성 페이지 크기와 함께 요청 된 페이지 번호에서 전송이 방법 :

    약간의 Aaronaught의 솔루션에 대한 변화, 나는 일반적으로 변수화 페이지 번호 (@PageNum) 및 페이지 크기 (@PageSize를) 추가. 각 페이지의 클릭 이벤트는 단지 구성 페이지 크기와 함께 요청 된 페이지 번호에서 전송이 방법 :

    begin
        with My_CTE  as
        (
             SELECT col1,
                  ROW_NUMBER() OVER(ORDER BY col1) AS row_number
         FROM
              My_Table
         WHERE
              <<<whatever>>>
        )
        select * from My_CTE
                WHERE RowNum BETWEEN (@PageNum - 1) * (@PageSize + 1) 
                                  AND @PageNum * @PageSize
    
    end
    
  9. ==============================

    9.내가 할 수있는 가장 가까운입니다

    내가 할 수있는 가장 가까운입니다

    select * FROM( SELECT *, ROW_NUMBER() over (ORDER BY ID ) as ct from [db].[dbo].[table] ) sub where ct > fromNumber  and ct <= toNumber
    

    나는 [dB]에서 *를 선택 비슷한 생각한다. [dbo가]. [표] LIMIT 0, 10

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

    10.

    select top (@TakeCount) * --FETCH NEXT
    from(
        Select  ROW_NUMBER() OVER (order by StartDate) AS rowid,*
        From YourTable
    )A
    where Rowid>@SkipCount --OFFSET
    
  11. ==============================

    11.

    @nombre_row :nombre ligne par page  
    @page:numero de la page
    
    //--------------code sql---------------
    
    declare  @page int,@nombre_row int;
        set @page='2';
        set @nombre_row=5;
        SELECT  *
    FROM    ( SELECT    ROW_NUMBER() OVER ( ORDER BY etudiant_ID ) AS RowNum, *
          FROM      etudiant
    
        ) AS RowConstrainedResult
    WHERE   RowNum >= ((@page-1)*@nombre_row)+1
        AND RowNum < ((@page)*@nombre_row)+1
    ORDER BY RowNum
    
  12. ==============================

    12.아직 아무도이 코드를 제공하지 가입일 :

    아직 아무도이 코드를 제공하지 가입일 :

    SELECT TOP @limit f1, f2, f3...
    FROM t1
    WHERE c1 = v1, c2 > v2...
    AND
        t1.id NOT IN
            (SELECT TOP @offset id
             FROM t1
             WHERE c1 = v1, c2 > v2...
             ORDER BY o1, o2...)
    ORDER BY o1, o2...
    

    중요 포인트 :

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

    13.

    -- @RowsPerPage  can be a fixed number and @PageNumber number can be passed 
    DECLARE @RowsPerPage INT = 10, @PageNumber INT = 2
    
    SELECT *
    
    FROM MemberEmployeeData
    
    ORDER BY EmployeeNumber
    
    OFFSET @PageNumber*@RowsPerPage ROWS
    
    FETCH NEXT 10 ROWS ONLY
    
  14. ==============================

    14.SQL 서버에서는 함께 ROW_NUMBER와 TOP ()를 사용합니다

    SQL 서버에서는 함께 ROW_NUMBER와 TOP ()를 사용합니다

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

    15.특히 SQL-SERVER 당신은 실제 예 주어진 다양한 ways.For 우리가 여기에 고객 테이블을했다 것을 달성 할 수있다.

    특히 SQL-SERVER 당신은 실제 예 주어진 다양한 ways.For 우리가 여기에 고객 테이블을했다 것을 달성 할 수있다.

    예 1 : "SET의 ROWCOUNT"으로

    SET ROWCOUNT 10
    SELECT CustomerID, CompanyName from Customers
    ORDER BY CompanyName
    

    0로 설정 ROWCOUNT를 모든 행을 반환하려면

    SET ROWCOUNT 0  
    SELECT CustomerID, CompanyName from Customers
        ORDER BY CompanyName
    

    예 2 : "ROW_NUMBER 및 OVER"로

    With Cust AS
    ( SELECT CustomerID, CompanyName,
    ROW_NUMBER() OVER (order by CompanyName) as RowNumber 
    FROM Customers )
    select *
    from Cust
    Where RowNumber Between 0 and 10
    

    예 3 : "OFFSET 및 FETCH", 그러나 "BY ORDER"와 함께 필수입니다

    SELECT CustomerID, CompanyName FROM Customers
    ORDER BY CompanyName
    OFFSET 0 ROWS
    FETCH NEXT 10 ROWS ONLY
    

    이 당신을 도움이되기를 바랍니다.

  16. from https://stackoverflow.com/questions/2135418/equivalent-of-limit-and-offset-for-sql-server by cc-by-sa and MIT license