복붙노트

[SQL] 어떻게 순수한 SQL에 LINQ의 .Skip (1000) .Take (100)을 작성하려면 어떻게해야합니까?

SQL

어떻게 순수한 SQL에 LINQ의 .Skip (1000) .Take (100)을 작성하려면 어떻게해야합니까?

LINQ의 .Skip () 메소드의 SQL 상응하는 무엇입니까?

예를 들면 : 나는 특정 데이터베이스 테이블에서 행 1000-1100을 선택하고 싶습니다.

이것은 단지 SQL과 수 있습니까? 아니면 다음, 전체 테이블을 선택하여 메모리에 행을 찾을 필요합니까? 나는 가능하면 테이블이 매우 클 수 있기 때문에,이를 방지하기 위해 같은 이상적 것입니다.

해결법

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

    1.SQL Server 2005에서는 이상 당신은 ROW_NUMBER 기능을 사용할 수 있습니다. 예를 들면.

    SQL Server 2005에서는 이상 당신은 ROW_NUMBER 기능을 사용할 수 있습니다. 예를 들면.

    USE AdventureWorks;
    GO
    WITH OrderedOrders AS
    (
        SELECT SalesOrderID, OrderDate,
        ROW_NUMBER() OVER (ORDER BY OrderDate) AS 'RowNumber'
        FROM Sales.SalesOrderHeader 
    ) 
    SELECT * 
    FROM OrderedOrders 
    WHERE RowNumber BETWEEN 51 AND 60; --BETWEEN is inclusive
    
  2. ==============================

    2.SQL 서버 2012 위의 구문을 추가했습니다 :

    SQL 서버 2012 위의 구문을 추가했습니다 :

    SELECT *
    FROM Sales.SalesOrderHeader 
    ORDER BY OrderDate
    OFFSET (@Skip) ROWS FETCH NEXT (@Take) ROWS ONLY
    
  3. ==============================

    3.SQL에 LINQ는 ROW_NUMBER의 윈도우 기능을 사용하여이 작업을 수행합니다 :

    SQL에 LINQ는 ROW_NUMBER의 윈도우 기능을 사용하여이 작업을 수행합니다 :

      SELECT a,b,c FROM 
       (SELECT a,b,c, ROW_NUMBER() OVER (ORDER BY ...) as row_number
        FROM Table) t0
       WHERE to.row_number BETWEEN 1000 and 1100;
    

    이 작품,하지만 쿼리에 발생할 수 ORDER BY에서 ROW_NUMBER을 제조 할 필요는 서버 측과 원인 성능 문제에 분류된다. 인덱스 요구 사항에 의해 순서를 만족시킬 수있는 경우에도 쿼리는 여전히 결과를 반환 startting 전에 1000 개 행을 계산한다. 모든 너무 자주 개발자는이를 잊고 단지 첫 번째 페이지가 너무 빨리 지난 것보다 반환하는 이유 5 백만 행 테이블과 경이를 통해 매김 제어를 던져 ...

    없음 덜, ROW_NUMBER를 사용하여 ()가 아마 사용의 용이성과 좋은 성능 사이에서 최적의 균형입니다, 당신은 당신이 정렬 (조건 BY 주문이 인덱스에 의해 만족스러운 될 수있다)을 피할 수 있도록 제공했다.

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

    4.이거 한번 해봐:

    이거 한번 해봐:

    select * from [Table-Name] order by [Column-Name] 
    offset [Skip-Count] rows
    FETCH NEXT [Take-Count] rows only
    

    예:

    select * from Personals order by Id
    offset 10 rows            --------->Skip 10
    FETCH NEXT 15 rows only   --------->Take 15
    
  5. ==============================

    5.이 작업을 수행:

    이 작업을 수행:

    는 SQL 출력에서 ​​SQL의 데이터 컨텍스트와 모양에 LINQ에 실행 .Skip (1000) .Take (100). 그것은 당신이 설명하는지 않는 당신을위한 SQL 문을 생성합니다.

    그것은 우아한으로하지 않습니다하지만 일을 가져옵니다.

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

    6.아니,하지만 당신은 동일한 결과를 달성하기 위해 MySQL의 LIMIT 절 (유래 링크)를 시뮬레이션 할 수 있습니다.

    아니,하지만 당신은 동일한 결과를 달성하기 위해 MySQL의 LIMIT 절 (유래 링크)를 시뮬레이션 할 수 있습니다.

  7. from https://stackoverflow.com/questions/1744802/how-do-i-write-linqs-skip1000-take100-in-pure-sql by cc-by-sa and MIT license