|
| |
오병택(siff7)
2012/10/31 15:51:05
|
|
|
이런설명 애매하죠~
table desc
------------
idx int NOt NULL autoincrement primary key
clm1 varchar(10) Null
clm2 varchar(10) Null
위와 같이 idx, clm1, clm2 라는 컬럼을 가지고 있는 테이블이 있을때
page = 1; // 현재 페이지
pagesize = 10; // 페이지당 글 갯수
select top #(pagesize) * from table where idx not in (select top #((page -1) * pagesize) idx from table order by idx desc) order by idx desc
#( ) 안에 감싸져있는건 변수로 유동적인 처리.
|
2 0 0 |
|
|
|
|
|
|
|
|
| |
오병택(siff7)
2012/10/31 15:51:10
|
|
|
변수는 위 정의해놓은것에 따라 설명
서브쿼리에서 idx값만 top (page-1)*pagesize 값만큼 가져옴
가져온 값을 not in 쿼리로 제외하고, 그 값을 다시 메인쿼리의 top pagesize 만큼 불러옴
위 상황을 보자면
page 가 1 이고 pagesize 10 이다.
서브쿼리의 값은 select top 0 idx from table order by idx desc가 되기 때문에 아무값도 가져오지 않는다.(1번 페이지 이기 때문에 모든 글을 불러옴)
where idx not in 에서 아무것도 걸러내질 않기 때문에 메인쿼리의 top 10 에 의해 전체 데이터의 상위 10건을 가져온다.
|
2 0 0 |
|
|
|
|
|
|
|
|
| |
오병택(siff7)
2012/10/31 15:51:20
|
|
|
만약 page 가 2일경우
서브쿼리의 값은 select top 10 idx from table order by idx desc가 되기 때문에 전체 데이터의 상위 10건을 가져온다.
where idx not in 서브쿼로 인해 담겨진 상위 10건을 제외한 나머지 데이터에서 메인쿼리의 top 10 에 의해 10건을 가져온다
상위 10건이 제외되고 그다음 10건이 가져온거기 때문에 두번째 페이지 이다.
이 쿼리의 단점은
페이지를 뒤로 넘길수록 데이터 리딩 속도가 느려진다는점 ㅋ
서브쿼리에서 top (page-1)*10 을 하기 떄문에 page 가 40 이면 (40-1)*10 = 390개의 자료를 읽기 때문이다.
그리고 Not in where 절이 서브 쿼리 에서 가져온 값을 가지고 한번더 돌기 때문에 무겁다.
|
2 0 0 |
|
|
|
|
|
|
|