복붙노트

[SQL] SQL Server의 LIMIT 10 ... 20

SQL

SQL Server의 LIMIT 10 ... 20

내가 뭔가를 같이 할 노력하고있어 :

SELECT * FROM table LIMIT 10,20

또는

SELECT * FROM table LIMIT 10 OFFSET 10

그러나 SQL Server를 사용하여

유일한 해결책 나는 과도 같은 모습을 발견 :

SELECT * FROM ( 
  SELECT *, ROW_NUMBER() OVER (ORDER BY name) as row FROM sys.databases 
 ) a WHERE row > 5 and row <= 10

나는 또한 발견

SELECT TOP 10 * FROM stuff; 

...하지만 내가 시작 제한을 지정할 수 없기 때문에 무엇을 원하는 아니다.

그렇게 나를 위해 또 다른 방법이 있습니까?

또한, 그냥 궁금해서, SQL Server가 LIMIT 기능 또는 이와 유사한를 지원하지 않는 이유는 무엇입니까? 내 말은되고 싶지 않아,하지만 정말 그렇게 무식한 것이 않는 경우, 미안 해요 ... 뭔가 같은 DBMS의 요구를 소리! 그래서 지난 5 년간 MySQL과 SQL + 작업 봤는데 ...

해결법

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

    1.한계 절은 표준 SQL의 일부가 아닙니다. 그것은 MySQL은, PostgreSQL을, 그리고 SQLite는에 의해 SQL에 대한 공급 업체의 확장으로 지원합니다.

    한계 절은 표준 SQL의 일부가 아닙니다. 그것은 MySQL은, PostgreSQL을, 그리고 SQLite는에 의해 SQL에 대한 공급 업체의 확장으로 지원합니다.

    데이터베이스의 다른 브랜드와 유사한 기능 (마이크로 소프트 SQL 서버에서, 예를 들어 TOP)를 가질 수 있지만, 이들은 항상 동일하게 작동하지 않습니다.

    그것은 모방 LIMIT 절에 마이크로 소프트 SQL 서버에서 TOP을 사용하는 것이 어렵다. 그냥 작동하지 않는 경우가 있습니다.

    이 솔루션은 당신이 ROW_NUMBER () 마이크로 소프트 SQL 서버 2005 이상에서 사용할 수를 사용했다. 이것은 전적으로 쿼리의 일부로 작동 (지금은) 가장 좋은 솔루션입니다.

    또 다른 해결책은 첫 번째 카운트 + 오프셋 행을 가져 TOP을 사용하여, 다음 첫 번째 오프셋 행을지나 추구하기 위해 API를 사용하는 것입니다.

    또한보십시오:

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

    2.SQL 서버 2012는 사용할 수 있습니다 +.

    SQL 서버 2012는 사용할 수 있습니다 +.

    SELECT  *
    FROM     sys.databases
    ORDER BY name 
    OFFSET  5 ROWS 
    FETCH NEXT 5 ROWS ONLY 
    
  3. ==============================

    3.당신이 발견,이 선호하는 SQL 서버 방법입니다 :

    당신이 발견,이 선호하는 SQL 서버 방법입니다 :

    SELECT * FROM ( 
      SELECT *, ROW_NUMBER() OVER (ORDER BY name) as row FROM sys.databases 
     ) a WHERE a.row > 5 and a.row <= 10
    
  4. ==============================

    4.당신이 마틴 스미스의 답변에 대한 SQL 서버 2012+ 투표를 사용하고 ORDER BY에 OFFSET 및 FETCH NEXT 확장을 사용하는 경우,

    당신이 마틴 스미스의 답변에 대한 SQL 서버 2012+ 투표를 사용하고 ORDER BY에 OFFSET 및 FETCH NEXT 확장을 사용하는 경우,

    이전 버전과 붙어있을만큼 불행한 경우에, 당신은이 같은 뭔가를 할 수

    WITH Rows AS
    (
        SELECT
                  ROW_NUMBER() OVER (ORDER BY [dbo].[SomeColumn]) [Row]
                , *
            FROM
                  [dbo].[SomeTable]
    )
    SELECT TOP 10
              *
         FROM
             Rows
        WHERE Row > 10
    

    나는 기능적으로 동일 믿는다

    SELECT * FROM SomeTable LIMIT 10 OFFSET 10 ORDER BY SomeColumn
    

    및 MS SQL 2012 전에 내가 TSQL에서 그 일을 알고있는 최고의 수행 방법.

    매우 많은 행이있는 경우에 당신은 대신 CTE의 임시 테이블을 사용하여 더 나은 성능을 얻을 수 있습니다.

  5. ==============================

    5.불행하게도, ROW_NUMBER ()는 당신이 할 수있는 최선이다. 제한 또는 상단 조항의 결과는 정말 일부 특정 순서에 대하여없이 의미가 없기 때문에 그것은 실제로 더 맞습니다. 하지만 여전히 할 수있는 고통입니다.

    불행하게도, ROW_NUMBER ()는 당신이 할 수있는 최선이다. 제한 또는 상단 조항의 결과는 정말 일부 특정 순서에 대하여없이 의미가 없기 때문에 그것은 실제로 더 맞습니다. 하지만 여전히 할 수있는 고통입니다.

    업데이트 :는 SQL 서버 2012 OFFSET 및 FETCH 키워드를 통해 기능 -like 제한을 추가합니다. 비표준 MySQL의 확장이다 LIMIT, 반대로 이것은 ANSI 표준 접근 방식입니다.

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

    6.이건 어때?

    이건 어때?

    SET ROWCOUNT 10 
    
    SELECT TOP 20 *
    FROM sys.databases
    ORDER BY database_id DESC
    

    그것은 당신에게 처음 20 행의 마지막 10 개 행을 제공합니다. 한 가지 단점은 적어도 그것을 기억하기 쉽게, 순서가 반대로되어 있지만.

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

    7.

    SELECT TOP 10 *
    FROM TABLE
    WHERE IDCOLUMN NOT IN (SELECT TOP 10 IDCOLUMN FROM TABLE)
    

    기록 11-20를 제공해야합니다. 아마이 아니라 반드시이 순서에 의해 영향을받을 수 있는지, 더 페이지를 얻을 수 증가도 효율적으로하지 않을 경우. 두 문이를 지정해야 할 수도 있습니다.

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

    8.좋은 방법은 프로 시저를 작성하는 것입니다 :

    좋은 방법은 프로 시저를 작성하는 것입니다 :

    create proc pagination (@startfrom int ,@endto int) as
    SELECT * FROM ( 
      SELECT *, ROW_NUMBER() OVER (ORDER BY name desc) as row FROM sys.databases 
     ) a WHERE a.row > @startfrom and a.row <= @endto
    

    다만 제한 0,2 등 /////////////// 페이징을 수행 0,4

  9. ==============================

    9.그냥 기록 솔루션에 대한 대부분의 데이터베이스 엔진에 작품은 힘이 가장 효율적인 것은 아니지만 것을 :

    그냥 기록 솔루션에 대한 대부분의 데이터베이스 엔진에 작품은 힘이 가장 효율적인 것은 아니지만 것을 :

    Select Top (ReturnCount) *
    From (
        Select Top (SkipCount + ReturnCount) *
        From SourceTable
        Order By ReverseSortCondition
    ) ReverseSorted
    Order By SortCondition
    

    Pelase 노트 : 마지막 페이지가 여전히 문제 SKIPCOUNT가 무엇인지 ReturnCount 행을 포함하지 않을 것이다. 그러나 많은 경우에 좋은 일이 될 수 있습니다.

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

    10.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
    
  11. ==============================

    11.

    select * from (select id,name,ROW_NUMBER() OVER (ORDER BY id  asc) as row
    from tableName1) tbl1
    where tbl1.row>=10 and tbl1.row<=15
    

    10에서 15 행을 인쇄합니다.

  12. ==============================

    12.지금까지이 형식은 나 (안 최고의 성능하지만) 무엇을 노력하고 있습니다 :

    지금까지이 형식은 나 (안 최고의 성능하지만) 무엇을 노력하고 있습니다 :

    SELECT TOP {desired amount of rows} * 
    FROM (SELECT *, ROW_NUMBER() OVER (ORDER BY {order columns} asc)__row__ FROM {table})tmp
    WHERE __row__ > {offset row count}
    

    동적 데이터를 통해 paginating 측면에 참고, 이상한 / 예기치 않은 결과가 발생할 수 있습니다.

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

    13.는 MS SQL 서버 온라인 설명서 (http://technet.microsoft.com/en-us/library/ms186734.aspx에서 ), 여기에 내가 테스트하고 특정 행 세트를 검색하기위한, 작동 한 그들의 예입니다. ROW_NUMBER는 OVER 필요하지만, 당신은 당신이 무엇을 등으로 주문할 수 있습니다 :

    는 MS SQL 서버 온라인 설명서 (http://technet.microsoft.com/en-us/library/ms186734.aspx에서 ), 여기에 내가 테스트하고 특정 행 세트를 검색하기위한, 작동 한 그들의 예입니다. ROW_NUMBER는 OVER 필요하지만, 당신은 당신이 무엇을 등으로 주문할 수 있습니다 :

    WITH OrderedOrders AS
    (
      SELECT SalesOrderID, OrderDate,
      ROW_NUMBER() OVER (ORDER BY OrderDate) AS RowNumber
      FROM Sales.SalesOrderHeader 
    ) 
    SELECT SalesOrderID, OrderDate, RowNumber  
    FROM OrderedOrders 
    WHERE RowNumber BETWEEN 50 AND 60;
    
  14. ==============================

    14.모든 SQL 서버를 사용 : ;와 같은 TBL (기준 (순서 위에 SELECT ROW_NUMBER () (rowIndex에 같은 표에서 *)) (1)을 선택) TBL rowIndex에> = 10에서 상위 10 *을 선택

    모든 SQL 서버를 사용 : ;와 같은 TBL (기준 (순서 위에 SELECT ROW_NUMBER () (rowIndex에 같은 표에서 *)) (1)을 선택) TBL rowIndex에> = 10에서 상위 10 *을 선택

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

    15.

     SELECT * FROM users WHERE Id Between 15 and 25
    

    그것은 MySQL은 같은 한계로 25 (15)에서 출력합니다

  16. from https://stackoverflow.com/questions/971964/limit-10-20-in-sql-server by cc-by-sa and MIT license