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