infection...

Oracel Pageing 방법론 본문

Develop/DATABASE

Oracel Pageing 방법론

돗거노인 2014. 12. 16. 09:44
기존에 전통적으로 쓰는 방법으로 rownum 을 구해서 페이징 처리를 했다. 문제는 이 방법을 쓸경우 별도로 페이징 계산까지 해와야 하는 불편함 이 발생
SELECT PROD_CD,PROD_NM,CATEGORY_CD,VEN_NM,VEN_CD,STANDARD_CONTENT,PROD_SELL_CD
	    FROM ( SELECT ROWNUM AS RNUM,PROD_CD,PROD_NM,CATEGORY_CD,VEN_CD,VEN_NM,STANDARD_CONTENT,PROD_SELL_CD
		      FROM(
		      SELECT A.PROD_CD,A.PROD_NM,A.CATEGORY_CD,A.VEN_CD,A.STANDARD_CONTENT,C.VEN_NM,D.PROD_SELL_CD FROM TSC_PROD_MST  A ,
		       (SELECT CATEGORY_CD
		       FROM TSC_CATEGORY_MST
		        WHERE LEVEL = 3
		        START WITH UP_CATEGORY_CD='67'
		        CONNECT BY PRIOR CATEGORY_CD = UP_CATEGORY_CD ) B ,
		         TSC_VEN_MST C ,
		         TSC_PROD_SELL_MST D
		      WHERE A.USE_YN='Y' and A.VEN_CD = C.VEN_CD AND A.CATEGORY_CD = B.CATEGORY_CD
		      AND A.PROD_CD = D.PROD_CD
		      ORDER BY A.PROD_CD DESC
	      )
  		)WHERE RNUM BETWEEN 1 AND 20
 
oracle 10g이상은 oracle hint 를 이용해서 편하게 구해올수있다.
SELECT PROD_CD,PROD_NM,CATEGORY_CD,VEN_NM,VEN_CD,STANDARD_CONTENT,PROD_SELL_CD,PAGE,PAGECOUNT,ROWSCOUNT
	    FROM ( SELECT ROWNUM AS RNUM,PROD_CD,PROD_NM,CATEGORY_CD,VEN_CD,VEN_NM,STANDARD_CONTENT,PROD_SELL_CD
      ,CEIL(COUNT(1) OVER() / 20) PAGECOUNT
      ,CEIL(rownum/20) AS PAGE
      ,CEIL(COUNT(1) OVER()) ROWSCOUNT  
		      FROM(
		      SELECT A.PROD_CD,A.PROD_NM,A.CATEGORY_CD,A.VEN_CD,A.STANDARD_CONTENT,C.VEN_NM,D.PROD_SELL_CD FROM TSC_PROD_MST  A ,
		       (SELECT CATEGORY_CD
		       FROM TSC_CATEGORY_MST
		        WHERE LEVEL = 3
		        START WITH UP_CATEGORY_CD='67'
		        CONNECT BY PRIOR CATEGORY_CD = UP_CATEGORY_CD ) B ,
		         TSC_VEN_MST C ,
		         TSC_PROD_SELL_MST D
		      WHERE A.USE_YN='Y' and A.VEN_CD = C.VEN_CD AND A.CATEGORY_CD = B.CATEGORY_CD
		      AND A.PROD_CD = D.PROD_CD
		      ORDER BY A.PROD_CD DESC
	      )
  		)WHERE PAGE=1