2009. 7. 6. 21:05
MSSQL 에서 페이징하기 그거/DB2009. 7. 6. 21:05
ORACLE, MYSQL에서 페이징은 수도 없이 해봤는데...(그렇다고 잘아는건 아니지만)
MSSQL에서는 정말 오랜만에(처음일 수도 있다는...) 페이징 쿼리를 만들었다...
이게 제대로 동작을 하는것 같긴 한데..
테이블은 아래와 같이 3개가 있다.
tbl_user : 사용자 정보
tbl_rcv_fax : 팩스 수신 목록
tbl_fax_pool : 팩스 번호 관리
테이블 3개를 조인해야 되는 조건인데..
처음에는 테이블을 전부 조인한 후에 페이징을 했더니.. 쿼리 실행하면 미친다 -_-;
그래서, 실제 필요한 데이터에 대해서(팩스 수신 목록)만 먼저 페이징을 했다.
그리고, 나중에 조인을 했다.. 그랬더니.. 잘된다. ㅎㅎ
tbl_fax_pool.group_id = tbl_user.group_id
tbl_fax_pool.fax_num = tbl_rcv_fax.rcv_fax_num
요런 조인이다.
-- FAX 수신 목록 조회
select RCV.RNUM,
USR.USER_ID, USR.NAME_KOR, USR.GROUP_ID, USR.ORG_CD,USR.ORG_NM, POOL.FAX_NUM,
RCV.SEQ_NO, RCV.RCV_TIME, RCV.SVR_IP, RCV.FILE_URL, RCV.FILESIZE, RCV.TOTAL_PCOUNT,
RCV.RCV_FAX_NUM, RCV.CALLER_ID, RCV.MAIL_FLAG, RCV.PORT_NUM
from
( -- RCV 수신 목록 테이블에서 추출한 데이터와 POOL, USER 테이블과 조인
select * from ( -- T1 RNUM을 이용해 페이징 처리
select top
(
select count(seq_no) from tbl_rcv_fax with(index(pk_tbl_rcv_fax),nolock)
where rcv_time between '2009-06-09' and '2009-06-23'
) -- 수신 목록 테이블에서 해당 날짜의 전체 개수 추출
ROW_NUMBER() OVER (ORDER BY SEQ_NO DESC) AS RNUM,
seq_no, rcv_time, svr_ip, file_url,
filesize, total_pcount, rcv_fax_num,
caller_id, mail_flag, port_num
from tbl_rcv_fax WITH(INDEX(PK_tbl_rcv_fax), NOLOCK)
where rcv_time BETWEEN '2009-06-09' AND '2009-06-23'
order by seq_no desc
) T1
WHERE T1.RNUM >= 21 AND T1.RNUM <= 30 -- 여기에 각 페이지별로 보여줄 시작/끝 번호를 넣어주면 된다.
) RCV, TBL_FAX_POOL POOL, TBL_USER USR
WHERE RCV.RCV_FAX_NUM = POOL.FAX_NUM AND POOL.GROUP_ID = USR.GROUP_ID
ORDER BY RCV.RNUM
아래는 실행계획의 일부이다. 솔직히 실행계획 볼 줄 모른다.
그래도. 쿼리는 빨리 되는것 같다. -_-;
'그거 > DB' 카테고리의 다른 글
파티션 테이블 조회하기 (0) | 2011.07.26 |
---|---|
[DB] MSSQL 실행된 쿼리 조회하기... (0) | 2010.01.29 |
ORA-01843 : 지정한 월이 부적합합니다. (0) | 2009.04.30 |
A 테이블의 특정 컬럼의 값을 B 테이블의 특정 컬럼 값으로 UPDATE 하는 PL/SQL (0) | 2008.12.08 |
TOAD에서 Explain plan 사용하기 (0) | 2007.08.02 |