예를 들어, SOME_TABLE 테이블 안에 SEQNO, CNT 컬럼이 있다.
SEQNO 컬럼은 기본 키이고, CNT 컬럼은 중복된 값이 올 수 있으며 숫자만 취급한다.
여기서 CNT가 제일 큰 값을 찾으려면 아래와 같이 작성할 수 있을 것이다.
SELECT
MAX(CNT)
FROM
SOME_TABLE
근데 여기서 CNT가 제일 큰 값의 레코드 중에 다른 컬럼의 데이터를 가져오고 싶은 경우가 있다.
그렇다면 아래와 같이 작성할 수도 있을 것이다.
SELECT
SEQNO,
CNT
FROM
SOME_TABLE
WHERE
CNT = (
SELECT
MAX(CNT)
FROM
SOME_TABLE
)
AND romnum = 1
근데 위와 같이 작성하지 않아도 Oracle 에서는 아래처럼 쉽게 가져올 수 있는 문법이 있다.
SELECT
-- 제일 큰 값
MAX(seqno) KEEP (DENSE_RANK FIRST ORDER BY cnt DESC)
-- 제일 작은 값
MIN(seqno) KEEP (DENSE_RANK LAST ORDER BY cnt DESC)
FROM
some_table
EXPLAIN PLAN을 했을 때 COST를 따져보면 위와 같이 작성하는 것이 오히려 성능적으로 좋은 경우가 있다.
'프로그래밍 > DB' 카테고리의 다른 글
[DB] Oracle PIVOT 사용 방법 및 조회 시 성능 주의사항 (0) | 2024.03.11 |
---|---|
[DB] Oracle 날짜 계산 시 INTERVAL 보단 ADD_MONTHS 를 사용하자 (1) | 2024.03.04 |
[DB] H2 데이터베이스 설정 초기화 (0) | 2022.09.28 |
[DB] Can't connect to local MySQL server through socket '/tmp/mysql.sock' (0) | 2019.08.29 |
[DB] mongoDB 외부 접속 허용하기 (0) | 2017.01.15 |