티스토리 뷰

Postgresql과 Oracle의 차이점은 페이징 처리이다!

(최근 오라클은 12버전부터 offset과 limit이 추가되었다.)

 

 

1. Oracle에서 페이징 처리 (RNUM)

 

오라클에서는 페이징 처리를 할때 RNUM 을 사용한다.

 

RNUM은 조회된 순서대로 순번을 메긴다.

조회된 결과를 순서메기고, 거기서 페이지에 노출 할 개수대로 잘라서 페이징 처리를 하는것

 

SELECT 
	(ROW_NUMBER() OVER ()) AS RNUM
	,first_name
    ,last_name
    ,phone_number
    ,age
FROM 
	customer
    
<if test="firstIndex != null and !firstIndex.equals('') ">
	WHERE TTA.RNUM BETWEEN 
	#{firstIndex} AND 
</if> 
<if test="lastIndex != null and !lastIndex.equals('') ">
	#{lastIndex}
</if>

 

 

 

 

2. Postgresql에서 페이징 처리 (OFFSET, FETCH)

 

2-1) 먼저 OFFSET과 FETCH를 설명하면

 

OFFSET 은 시작행을 지정

FETCH는 출력할 행의 수를 지정

 

예시는 아래와 같다.

offset 0 rows fetch next 10 rows only
//시작행은 0번이고 출력할 행은 10개이다.

offset 11 rows fetch next 10 rows only
//시작행은 11번이고 출력할 행은 10개이다.

 

 

 

2-2) 옵션

 

위의 페이징 처리에서 다른 옵션이 존재한다.

일단 위의 문법의 사용형식은 아래와 같다.

 

OFFSET    n    ROWS                                    

 

- n개의 건너뛸 행의 수를 지정  →  즉 시작행을 정함

 

 

 

FETCH   FIRST/NEXT    n   ROWS ONLY/WITH TIES 

 

- FETCH                        반환할 n개의 row 수를 지정

- FIRST | NEXT             의미상으로만 구분하기 위한 구문 (암거나 써도 됨)

- ONLY                          지정한 행 수 만큼 리턴

- WITH TIES                 마지막 행과 같은 행도 반환, Order by절을 지정해야함

 

 

 

2-3) LIMIT

 

FETCH랑 같은 맥락으로 사용되는거로는 LIMIT이 존재한다.

LIMIT은 출력할 행을 한정할때 사용한다.

 

예시는 아래와 같다.

LIMIT 10

 <!-- 10개의 행을 출력 -->

 

 

 

2-4) 적용모습

SELECT 
	(ROW_NUMBER() OVER ()) AS RNUM
	,first_name
    ,last_name
    ,phone_number
    ,age
FROM 
	customer
    
<if test="firstIndex != null and !firstIndex.equals('') ">
	OFFSET #{firstIndex-1}
</if> 
<if test="lastIndex != null and !lastIndex.equals('') ">
	FETCH ((#{lastIndex}::INTEGER+1) - (#{firstIndex}::INTEGER)) ROWS ONLY
</if>

firstIndex 시작행    몇번째의 행 값이 노출될지 데이터를 입력받음

lastIndex 출력할 행     화면에 몇개 표출할건지 10, 20, 30,40, 50 ... 선택한 데이터를 입력받음

 

 

- 콘솔에서 쿼리 날아가는 모습

TTA offset(1::INTEGER - 1) rows FETCH NEXT ((10::INTEGER + 1) - (1::INTEGER)) rows ONLY

TTA offset(11::INTEGER - 1) rows FETCH NEXT ((20::INTEGER + 1) - (11::INTEGER)) rows ONLY

TTA offset(21::INTEGER - 1) rows FETCH NEXT ((30::INTEGER + 1) - (21::INTEGER)) rows ONLY

TTA offset(31::INTEGER - 1) rows FETCH NEXT ((40::INTEGER + 1) - (31::INTEGER)) rows ONLY

 

 

 

 

 

3. 페이징 처리

 

 

	SELECT  
			TA.eqt_mac_addr 
			,TA.bs_nm
			,TA.model_nm 
			,TD.mdl_knam 		AS model_typ
			,TG.wst_knam 		AS wst_typ
			,TA.rmk
			,TE.city_nam 		AS sido
			,TF.hdng_nam 		AS hnm
			,TC.ptn_addr
		FROM ( 
			
			SELECT 
				*
			FROM
				GMS_CHSE_TB
			<include refid="selectChseListWhereRef"></include>
			
	 	) TA
			    
			LEFT OUTER JOIN gms_chref_tb TB ON TA.eqt_mac_addr = TB.eqt_mac_addr
			LEFT OUTER JOIN cnhouse_loca TC ON TC.ptn_id = TB.ptn_id
			LEFT OUTER JOIN cd_mdl_type TD ON TA.model_typ = TD.mdl_enam
			LEFT OUTER JOIN cd_city TE ON TC.sido = TE.city 
			LEFT OUTER JOIN cd_hdng TF ON TC.hnm = TF.hdng   
			LEFT OUTER JOIN cd_wst_knd TG ON TA.wst_typ = TG.wst_enam   
			
			<if test="firstRecordIndex != null and !firstRecordIndex.equals('') ">
			  	offset (#{firstRecordIndex}::integer) 
			</if> 
			<if test="lastRecordIndex != null and !lastRecordIndex.equals('') ">
				limit ((#{lastRecordIndex}::integer) - (#{firstRecordIndex}::integer))
			</if> 





	<!-- 폐기물수거함 목록 조회 -->
	<select id="selectChseList" parameterType="ChseVO" resultType="ChseVO">
		SELECT 
			TTA.*
		FROM (
			SELECT (ROW_NUMBER() OVER ()) AS RNUM
				,TA.eqt_mac_addr
				,TA.bs_nm
				,TA.model_nm
				,TA.model_typ
				,TA.wst_typ
				,TA.rmk
				,TE.city_nam AS sido
				,TF.hdng_nam AS hnm
				,TC.ptn_addr
			FROM (
				SELECT *
				FROM GMS_CHSE_TB
				<include refid="selectChseListWhereRef"></include>
				) TA
			LEFT OUTER JOIN gms_chref_tb TB ON TA.eqt_mac_addr = TB.eqt_mac_addr
			LEFT OUTER JOIN cnhouse_loca TC ON TC.ptn_id = TB.ptn_id
			LEFT OUTER JOIN cd_mdl_type TD ON TA.model_typ = TD.mdl_enam
			LEFT OUTER JOIN cd_city TE ON TC.sido = TE.city
			LEFT OUTER JOIN cd_hdng TF ON TC.hnm = TF.hdng
			LEFT OUTER JOIN cd_wst_knd TG ON TA.wst_typ = TG.wst_enam
			
			<if test="ptn_id != null and !ptn_id.equals('')">
				where TC.ptn_id = #{ptn_id}
			</if>
		) TTA
		<if test="firstRecordIndex != null and !firstRecordIndex.equals('') ">
			WHERE TTA.RNUM BETWEEN 
		  	#{firstRecordIndex} AND 
		</if> 
		<if test="lastRecordIndex != null and !lastRecordIndex.equals('') ">
			#{lastRecordIndex}
		</if>
	</select>

 

 

Ref.

https://bae9086.tistory.com/111

 

Offset , Limit (페이징 처리)

12c 이전의 Oracle은 Top-N쿼리를 구현하기 위해 ROWNUM을 사용해 왔습니다. 하지만 이는 쿼리를 View로 감싸야 하고 순서보장을 원한시에는 한번더 View로 감싸 쿼리가 복잡해지는 단점이 있었습니다. O

bae9086.tistory.com

https://flowerknight.tistory.com/24

 

12. 마이바티스 WHERE 태그 주의사항

WHERE 태그를 안쓰고 이런식으로 userNm 값이 없이 쓰고 실행하면 에러발생 콘솔을 보면 덩그러니 뒤에 WHERE 만 있다. where 태그를 쓰는 이유는 if문을 타지 않으면 where 자체도 없어지기 때문에 매우

flowerknight.tistory.com

 

'DB' 카테고리의 다른 글

형변환하기 ::  (0) 2023.01.10
[Postgresql] 형변환  (0) 2022.09.27
boolean의 jdbcType  (0) 2022.09.27
CDATA  (0) 2022.09.14
[정렬] order by (형변환)  (0) 2022.09.07
댓글