복붙노트

[SQL] 이 쿼리 페이징 (/ 건너 뛰기 걸릴) 기능을 구현

SQL

이 쿼리 페이징 (/ 건너 뛰기 걸릴) 기능을 구현

나는이 같은 예를 읽는 기사를, SQL에서 사용자 정의 페이징을 구현하는 방법에 대해 조금 이해하려고 노력하고있다.

나는 완벽하게 작동 다음 쿼리를 보유하고 있습니다. 그러나 나는이 하나 페이징을 구현하고 싶습니다.

SELECT TOP x PostId FROM ( SELECT PostId, MAX (Datemade) as LastDate
 from dbForumEntry 
 group by PostId ) SubQueryAlias
 order by LastDate desc

그것은 내가 원하는 무엇입니까

나는 관련 항목이 포럼 게시물을 보유하고 있습니다. 나는 최근에 논란이 게시물을 선택할 수 있도록, 최신 추가 항목이 게시물을 싶어.

지금, 나는 대신에 "10"의에서 "10 20 최근에 활성화 된 게시물"을 얻을 수 있어야합니다.

나는 무엇 시도

나는 그러나 정말 행운과, 기사의 것과 ROW 기능을 구현하기 위해 노력했다.

모든 아이디어를 어떻게 그것을 구현하는 방법?

해결법

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

    1.SQL 서버 2012 년은 매우 쉽게 매우이다

    SQL 서버 2012 년은 매우 쉽게 매우이다

    SELECT col1, col2, ...
     FROM ...
     WHERE ... 
     ORDER BY -- this is a MUST there must be ORDER BY statement
    -- the paging comes here
    OFFSET     10 ROWS       -- skip 10 rows
    FETCH NEXT 10 ROWS ONLY; -- take 10 rows
    

    우리는 우리가 사용할 수 BY ORDER를 건너 뛰려면

    SELECT col1, col2, ...
      ...
     ORDER BY CURRENT_TIMESTAMP
    OFFSET     10 ROWS       -- skip 10 rows
    FETCH NEXT 10 ROWS ONLY; -- take 10 rows
    

    (- NHibernate에 의해, 예를 들어 있지만 사용되는 현명하게 집어 열을 사용하려면 ORDER BY가 선호하는 방법이기 때문에 차라리 해킹으로 그 표시 것입니다.)

    질문에 대답합니다 :

    --SQL SERVER 2012
    SELECT PostId FROM 
            ( SELECT PostId, MAX (Datemade) as LastDate
                from dbForumEntry 
                group by PostId 
            ) SubQueryAlias
     order by LastDate desc
    OFFSET 10 ROWS -- skip 10 rows
    FETCH NEXT 10 ROWS ONLY; -- take 10 rows
    

    새로운 키 워드 오프셋 도입 된 다음 (바로 다음 SQL 표준)를 가져옵니다.

    그러나 나는 당신이 바로 2012 SQL 서버를 사용하지 않는 것으로 추측? 이전 버전에서는 조금 (조금) 어렵다. 여기에 모든 SQL 서버 버전에 대한 비교 및 ​​예는 다음과 같습니다 여기

    그래서,이 SQL 서버 2008에서 일할 수 :

    -- SQL SERVER 2008
    DECLARE @Start INT
    DECLARE @End INT
    SELECT @Start = 10,@End = 20;
    
    
    ;WITH PostCTE AS 
     ( SELECT PostId, MAX (Datemade) as LastDate
       ,ROW_NUMBER() OVER (ORDER BY PostId) AS RowNumber
       from dbForumEntry 
       group by PostId 
     )
    SELECT PostId, LastDate
    FROM PostCTE
    WHERE RowNumber > @Start AND RowNumber <= @End
    ORDER BY PostId
    
  2. ==============================

    2.당신은 당신이 원하는 행을 지정할 수 있도록 SQL 서버에서이 작업을 수행하기 위해, 당신은 열을 기준으로 쿼리를 주문해야합니다.

    당신은 당신이 원하는 행을 지정할 수 있도록 SQL 서버에서이 작업을 수행하기 위해, 당신은 열을 기준으로 쿼리를 주문해야합니다.

    예:

    select * from table order by [some_column] 
    offset 10 rows
    FETCH NEXT 10 rows only
    

    이 작업을 수행 할 때 그리고 당신은 "TOP"키워드를 사용할 수 없습니다.

    당신은 자세한 내용은 여기를 배울 수 있습니다 : https://technet.microsoft.com/pt-br/library/gg699618%28v=sql.110%29.aspx

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

    3.SQL 2008

    SQL 2008

    Radim 쾰러의 대답은 작동하지만, 여기에 짧은 버전입니다 :

    select top 20 * from
    (
    select *,
    ROW_NUMBER() OVER (ORDER BY columnid) AS ROW_NUM
    from tablename
    ) x
    where ROW_NUM>10
    

    출처 : https://forums.asp.net/post/4033909.aspx

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

    4.

    OFFSET     10 ROWS       -- skip 10 rows
    FETCH NEXT 10 ROWS ONLY; -- take 10 rows
    

    당신의 선택 구문의 끝에서 이것을 사용합니다. =)

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

    5.당신은 다음과 같은 페이지 매김을위한 중첩 된 쿼리를 사용할 수 있습니다 : 4 행의 기본 키는 고객 ID는 8 행 페이징

    당신은 다음과 같은 페이지 매김을위한 중첩 된 쿼리를 사용할 수 있습니다 : 4 행의 기본 키는 고객 ID는 8 행 페이징

    고객의 선택 상위 5 * WHERE 고객 FROM (SELECT 상위 3의 CustomerID의 나라 = '독일과 고객 ID 없음 도시 별 WHERE 국가 = '독일'순서) 시에서 주문;

  6. from https://stackoverflow.com/questions/13220743/implement-paging-skip-take-functionality-with-this-query by cc-by-sa and MIT license