티스토리 뷰
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
https://flowerknight.tistory.com/24
'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 |
- Total
- Today
- Yesterday
- 엑셀POI
- mybatisif
- jdbcType
- 인터넷안되는환경에서설치
- svn프로젝트불러오기
- createRow
- Centos7에서 Postgresql12 설치
- 리눅스폐쇄망
- 부하측정
- Postgresql12
- shp2pgsql
- postgis 설치
- getRow
- SVN
- 폐쇄망에서패키지설치
- OpenLayers
- 공간데이터병합
- Some resources were not updated.
- Geoserver
- yumrepository
- apachepoi
- 공간데이터
- 리눅스
- getCell
- Postgis
- CreateCell
- 폐쇄망에서rpm설치
- su postgres 안됨
- setForceFormulaRecalculation
- yumdownloader
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |