말랑말랑제리스타일

[Oracle SQL] 다른 컬럼을 우선순위로 지정해 값을 가져오기 본문

데이터베이스/Oracle SQL

[Oracle SQL] 다른 컬럼을 우선순위로 지정해 값을 가져오기

제리제리 2022. 9. 14. 07:43

Oracle SQL에서 간혹 다른 컬럼을 우선순위로 지정해서 특정 값을 가져와야할 경우가 있습니다.

예를 들어서 급여가 가장 높은 사원의 사번을 가져오는 경우라던지 가격이 가장 높은 제품의 제품 코드를 가져오는 경우가 있겠죠. 이런 경우 급여나 가격을 기준으로 사번과 제품 코드를 가져와야하는데 서브쿼리를 사용하면 많이 복잡해지죠.

서브쿼리를 사용해 다른 컬럼을 우선순위로 값을 가져오는 방법

반응형

그럼에도 쿼리가 상당히 단순한 경우 서브쿼리를 이용하는 방법도 존재하기 때문에 이론적으로 쉽게 이해할 수 있는 서브쿼리를 사용해 다른 컬럼을 우선순위로 값을 가져오는 쿼리를먼저 알려드리겠습니다.

아래 예시는 어떤 제품의 가격타입별로 가격이 들어있는 테이블에서 가격 타입이 가장 낮은, 쉽게 말해 어떤 제품 A에 대해 a 방식의 가격, b 방식의 가격이 있다면 a 방식의 가격을 가져오도록 하는 쿼리입니다.

SELECT DISTINCT DISTINCT PROD_CD ,PRICE
FROM TABLE 
WHERE (PROD_CD,PRICE_TYPE) IN (SELECT PROD_CD,MIN(PRICE_TYPE) 
                                FROM TABLE 
                                GROUP BY PROD_CD)

서브쿼리 내에서 제품 코드와 가장 낮은 우선순위의 가격 결정 방식을 가져온 뒤 제품 코드와 가격이 해당 서브쿼리의 결과와 일치하는 값들만 추려내는 방법이죠.

딱 봤을 때 이해하기는 쉽지만 어딘가 조잡해 보이고 굳이 이 방법밖에 없을까?라는 의문이 생기는 쿼리입니다.

그렇기 때문에 우리는 ORACLE SQL 함수를 이용해서 쿼리를 좀 더 명료하게 만들어볼 수 있습니다.

ORACLE 함수를 사용해 다른 컬럼을 우선순위로 값을 가져오는 방법

반응형

그렇게 만들어볼 수 있는 쿼리는 아래와 같습니다.

SELECT PROD_CD,MIN(PRICE) KEEP (DENSE_RANK FIRST ORDER BY PRICE_TYPE) PRICE 
FROM T_MSRP 
GROUP BY PROD_CD

바로 KEEP 이라는 기능을 사용하는 방법인데요.

가격 결정 방식의 우선 순위에 따라 정렬한 최소 값을 가져온다는 의미로 생각하시면 오히려 쉽습니다.

저도 이 방법이 자주 생각이 안나기는 하는데 아무래도 익숙해지면 상당히 유용한 ORACLE SQL 구문이 되겠죠.

 

반응형
Comments