복붙노트

[SQL] 어떻게 SQL에서 결과의 페이지를 반환?

SQL

어떻게 SQL에서 결과의 페이지를 반환?

대부분의 응용 프로그램은 그리드를 한 번에 데이터베이스 테이블의 한 페이지에서 디스플레이 데이터. 그들 중 대부분은 사용자가 종류의 모든 열 및 탐색 다시에 의해 이리저리 결과를 통해, 페이지 당 레코드 수를 선택할 수 있습니다.

어떤 클라이언트의 데이터를 클라이언트로 전체 테이블을 가져오고 다음 필터링없이이 패턴을 구현하는 좋은 알고리즘입니다. 당신은 어떻게 당신이 사용자에게 표시 할 단지 기록을 가지고 있습니까?

합니까 LINQ 솔루션을 단순화?

해결법

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

    1.위의 MS SQL 서버 2005에서 ROW_NUMBER ()이 작동하는 것 같다 :

    위의 MS SQL 서버 2005에서 ROW_NUMBER ()이 작동하는 것 같다 :

    T-SQL : ROW_NUMBER와 페이징 ()

    DECLARE @PageNum AS INT;
    DECLARE @PageSize AS INT;
    SET @PageNum = 2;
    SET @PageSize = 10;
    
    WITH OrdersRN AS
    (
        SELECT ROW_NUMBER() OVER(ORDER BY OrderDate, OrderID) AS RowNum
              ,OrderID
              ,OrderDate
              ,CustomerID
              ,EmployeeID
          FROM dbo.Orders
    )
    
    SELECT * 
      FROM OrdersRN
     WHERE RowNum BETWEEN (@PageNum - 1) * @PageSize + 1 
                      AND @PageNum * @PageSize
     ORDER BY OrderDate
             ,OrderID;
    
  2. ==============================

    2.나도 사용하여 LINQ를 추천하거나 무엇을 복사하려고 것입니다. 나는 내가 LINQ를 타고 건너 뛰기 방법은 페이징 된 데이터를 검색하는 데 사용하는 응용 프로그램을 가지고있다. 코드는 다음과 같은 :

    나도 사용하여 LINQ를 추천하거나 무엇을 복사하려고 것입니다. 나는 내가 LINQ를 타고 건너 뛰기 방법은 페이징 된 데이터를 검색하는 데 사용하는 응용 프로그램을 가지고있다. 코드는 다음과 같은 :

    MyDataContext db = new MyDataContext();
    var results = db.Products
        .Skip((pageNumber - 1) * pageSize)
        .Take(pageSize);
    

    SQL Server 프로파일 러는 LINQ 유사한 SQL로이 쿼리를 변환되는 것을 알 수 실행 :

    SELECT [ProductId], [Name], [Cost], and so on...
    FROM (
        SELECT [ProductId], [Name], [Cost], [ROW_NUMBER]
        FROM (
           SELECT ROW_NUMBER() OVER (ORDER BY [Name]) AS [ROW_NUMBER], 
               [ProductId], [Name], [Cost]
           FROM [Products]
        )
        WHERE [ROW_NUMBER] BETWEEN 10 AND 20
    )
    ORDER BY [ROW_NUMBER]
    

    일반 영어 : 1. 필터 당신의 행과 당신이 원하는 순서대로 행 번호를 추가 할 ROW_NUMBER 함수를 사용합니다. 2. 필터 (1) 페이지에 만 원하는 행 번호를 반환합니다. (이름으로,이 경우) 당신이 원하는 순서와 동일 행 번호, 3. 정렬 (2).

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

    3.(난 당신이 SQL 서버를 사용하고 있으리라 믿고있어) 데이터베이스에 페이지 매김을하는 두 가지 방법이 기본적으로 있습니다 :

    (난 당신이 SQL 서버를 사용하고 있으리라 믿고있어) 데이터베이스에 페이지 매김을하는 두 가지 방법이 기본적으로 있습니다 :

    ROW_NUMBER () OVER () 순위 기능이 페이지를 수행하는 데 사용할 수있는 방법을 다른 사람은 설명했다. 표준 SQL에 대한 SQL 서버 2012 마지막 포함 지원이 오프셋 언급 그것의 가치는 .. 절을 FETCH :

    SELECT first_name, last_name, score
    FROM players
    ORDER BY score DESC
    OFFSET 40 ROWS FETCH NEXT 10 ROWS ONLY
    

    당신이 문제를 SQL 서버 2012 이전 버전과의 호환성을하지 않는 사용하는 경우가 코너의 경우 SQL Server가 더 최적으로 실행됩니다, 당신은 아마이 절을 선호한다.

    SQL에서 페이징을 수행 할 수있는 훨씬 더 빨리, 완전히 다른,하지만 덜 알려진 방법이있다. 이것은 종종 여기이 블로그 게시물에 설명 된대로이 "방법을 추구"라고합니다.

    SELECT TOP 10 first_name, last_name, score
    FROM players
    WHERE (score < @previousScore)
       OR (score = @previousScore AND player_id < @previousPlayerId)
    ORDER BY score DESC, player_id DESC
    

    @previousScore 및 @previousPlayerId 값은 이전 페이지에서 마지막 레코드의 각각의 값입니다. 이것은 당신이 "다음"페이지를 가져 오지 수 있습니다. 방향 BY 순서는 ASC 인 경우, 단순히 대신> 사용합니다.

    위의 방법을 사용하면 즉시 먼저 이전 (40 개) 기록을 인출하지 않고 4 페이지로 이동할 수 없습니다. 그러나 종종, 당신은 지금까지 어쨌든 점프하고 싶지 않아요. 대신, 당신은 당신의 색인에 따라 일정 시간에 데이터를 가져올 수있을 훨씬 빠른 쿼리를 얻을. 또한, 페이지가 "안정적"유지, 아무리 경우 (예를 들어, 1 페이지, 당신은 4 페이지에있는 동안) 기본 데이터가 변경됩니다.

    이 게으른 로딩 더 많은 웹 애플리케이션의 데이터 예를 들어, 페이징을 구현하는 가장 좋은 방법입니다.

    참고가 "방법을 추구"도 키 집합 페이징이라고합니다.

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

    4.닷넷 3.5 람다 표현식과 익명 클래스와 결합 된 LINQ는 상당히 이런 종류의 물건을 단순화합니다.

    닷넷 3.5 람다 표현식과 익명 클래스와 결합 된 LINQ는 상당히 이런 종류의 물건을 단순화합니다.

    데이터베이스 쿼리 :

    var customers = from c in db.customers
                    join p in db.purchases on c.CustomerID equals p.CustomerID
                    where p.purchases > 5
                    select c;
    

    페이지 당 레코드 수 :

    customers = customers.Skip(pageNum * pageSize).Take(pageSize);
    

    열을 기준으로 정렬 :

    customers = customers.OrderBy(c => c.LastName);
    

    서버에서 선택된 필드를 얻기 :

    var customers = from c in db.customers
                    join p in db.purchases on c.CustomerID equals p.CustomerID
                    where p.purchases > 5
                    select new
                    {
                        CustomerID = c.CustomerID,
                        FirstName = c.FirstName,
                        LastName = c.LastName
                    };
    

    이것은 당신이 그 속성에 액세스 할 수있는 정적으로 입력 된 익명의 클래스를 생성합니다 :

    var firstCustomer = customer.First();
    int id = firstCustomer.CustomerID;
    

    실제로 데이터를 필요로 할 때까지 데이터베이스에 이야기되지 않도록 쿼리의 결과는, 게으른로드 기본적으로 있습니다. 닷넷에서 LINQ는 크게 변경 한 내용의 데이터 컨텍스트를 유지 만 변경 필드를 업데이트하여 업데이트를 간소화합니다.

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

    5.오라클 솔루션 :

    오라클 솔루션 :

    select * from (
        select a.*, rownum rnum from (
            YOUR_QUERY_GOES_HERE -- including the order by
        ) a
        where rownum <= MAX_ROW
     ) where rnum >= MIN_ROW
    
  6. ==============================

    6.나는 MS SQL 2005와 함께 사용하는 몇 가지 해결책이 있습니다.

    나는 MS SQL 2005와 함께 사용하는 몇 가지 해결책이 있습니다.

    그 중 하나는 ROW_NUMBER ()이다. 하지만, 개인적으로, 나는 ROW_NUMBER () 큰 결과가 없기 때문에 작업 (내가 작업 DB 좋아하지 않아 정말 큰 - 1TB의 데이터가 초에서 쿼리의 수천을 실행하는 동안 - 당신은 알고있다 - 큰 소셜 네트워킹 대지).

    여기 내가 좋아하는 솔루션입니다.

    나는 T-SQL의 의사 코드의 종류를 사용합니다.

    의 사용자의 두번째 페이지는 각 페이지가 10 개 레코드가 뒤따라야, 성,으로 분류 찾아 보자.

    @page = 2 -- input parameter
    @size = 10 -- can be optional input parameter
    
    if @page < 1 then begin
        @page = 1 -- check page number
    end
    @start = (@page-1) * @size + 1 -- @page starts at record no @start
    
    -- find the beginning of page @page
    SELECT TOP (@start)
        @forename = forename,
        @surname = surname
        @id = id
    FROM
        users
    ORDER BY
        forename,
        surname,
        id -- to keep correct order in case of have two John Smith.
    
    -- select @size records starting from @start
    SELECT TOP (@size)
        id,
        forename,
        surname
    FROM
        users
    WHERE
        (forename = @forename and surname = @surname and id >= @id) -- the same name and surname, but bigger id
        OR (forename = @forename and surname > @surname) -- the same name, but bigger surname, id doesn't matter
        OR (forename > @forename) -- bigger forename, the rest doesn't matter
    ORDER BY
        forename,
        surname,
        id
    
  7. ==============================

    7.사실, LINQ는 반입되는 레코드를 선택하는 결합 될 수 건너와 테이크 방법이있다.

    사실, LINQ는 반입되는 레코드를 선택하는 결합 될 수 건너와 테이크 방법이있다.

    사람들을 확인하십시오.

    2005 매김에서 SQL 서버 : DB의 경우

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

    8.토론은 여기에 이것에 대해이

    토론은 여기에 이것에 대해이

    이 기술은 78ms에서 15 만 라인 데이터베이스에서 페이지 번호 100000를 가져옵니다

    나는 더 나은 현재 허용 대답보다 경우에 판단 할 수없는 나는 두렵다.

  9. from https://stackoverflow.com/questions/10190/how-to-return-a-page-of-results-from-sql by cc-by-sa and MIT license