DB/MSSQL

MS-SQL 2005 이상 row_number() over(order by 정렬조건) 을 이용하여 페이징쿼리를 동작시켜보자

개발로짜 2014. 8. 15. 18:07


2014/08/15 - [DB/MySQL] - MySQL LIMIT를 사용하여 페이징쿼리를 동작시켜보자


2014/08/15 - [DB/Oracle] - ORACLE 오라클 rownum을 이용하여 페이징 처리하기



이번에는 MS-SQL 2005버전 이상부터 지원을 하는 ROW_NUMBER() OVER(ORDER BY 정렬조건) 을 이용하여 페이징 처리를 다루도록 해보겠음.


MS-SQL 2000 버전에는 TOP을 이용하여 페이징 처리를 하였는데 이부분은 페이지가 뒤로 가면 갈수록 

느려지는 단점이 있다.

2005부터 ROW_NUMBER를 제공하기 시작했는데 ORACLE만큼 페이징이 편해졌다.

역시 샘플 데이터를 기준으로 설명하도록 하겠음.


1.  create table 생성

create table page_table (  
  [idx] bigint  NULL ,  
  [title] varchar(100)  NULL ,  
  [conetnt] varchar(200)  NULL 
);  

2. 가상의 데이터 IMPORT


page_table_data.sql




구조 및 가상의 데이터는 이전에 포스팅한 mysql 페이징과 같다

그렇다면 이제 페이징 테스트를 해보도록 하겠음.

각 페이징 처리를 할때마다 20개씩 출력해보도록 하겠다.


쿼리는 다음과 같다.

-- 1페이지
SELECT *
FROM (
  SELECT row_number() over(order by idx) rownum,*
    FROM page_table
) pagetable
where rownum between 1 and 20
-- 2페이지
SELECT *
FROM (
  SELECT row_number() over(order by idx) rownum,*
    FROM page_table
) pagetable
where rownum between 21 and 40
.
.
-- 5페이지
SELECT *
FROM (
  SELECT row_number() over(order by idx) rownum,*
    FROM page_table
) pagetable
where rownum between 81 and 100
-- 존재하지 않는 6페이지
SELECT *
FROM (
  SELECT row_number() over(order by idx) rownum,*
    FROM page_table
) pagetable
where rownum between 101 and 120

3, 실 행 하 기

1페이지



2페이지



5페이지



존재하지 않는 6페이지



ROW_NUMBER() OVER (ORDER BY ... )

쉽게 생각해서 테이블 데이터아 rownum이라는 컬럼을 추가해서 1부터 출력된 테이블의 갯수를 

순차적으로 증가 시켜주는거라고 생각하면 될것이다.

WHERE 절에 

where rownum컬럼 between start and end

라는 조건을 주어서 시작ROWNUM ~ 마지막으로 출력하고자하는 ROWNUM

을 데이터에 출력을 하는것이다.

물론 BETWEEN으로 안하고 

>=  AND <=  

이와같은 문법을 이용하여 페이징 처리를 해주어도 무관함.

마지막 존재하지 않는 6페이지일경우는 그냥 한번 출력해보았음.


슈퍼맨슈퍼맨슈퍼맨



도움이 되셨다면 공감클릭! 궁금하신점은 댓글!!