달력

4

« 2024/4 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
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


아래는 실행계획의 일부이다. 솔직히 실행계획 볼 줄 모른다.
그래도. 쿼리는 빨리 되는것 같다. -_-;


:
Posted by 뽀기