DataBase/SQL

SQLBOOSTER - RANGE JOIN

now0204 2024. 6. 6. 14:52

 

대부분 조인은 같다를 조건으로 이용하지만, 반드시 같다 조건으로만 조인을 할 수 있는 것은 아니다. 범위 (Like, <,>)조건을 줄 수도 있으며 때에 따라 같지않다를 사용할 수도 있다.

 

범위 조건을 이용해 조인하는 것을 RANGE JOIN이라 부른다.

 

먼저 RANGE JOIN 사용 전 이전 GROUP BY로 금액 유형에 따라 High,Low,Middle로 나누었던 쿼리를 살펴보자 

SELECT ORD_ST, 
    CASE WHEN ORD_AMT >= 5000 THEN 'HIGH'
         WHEN ORD_AMT >= 3000 THEN 'Middle Order'
         ELSE 'Low Order' END ORD_AMT_TP, COUNT(*) ORD_CNT
FROM T_ORD
GROUP BY ORD_ST, 
     CASE WHEN ORD_AMT >= 5000 THEN 'HIGH'
          WHEN ORD_AMT >= 3000 THEN 'Middle Order'
          ELSE 'Low Order' END
 ORDER BY 1,2;

일회성 쿼리라면, 이런 방식을 사용해도 좋지만, 여러번 사용한다면 테이블로 뺀 뒤에 RANGE JOIN 처리하는 편이 낫다.

 

아래와 같은 주문금액유형 테이블을 만들어두자, 금액 유형에 따라 High,Low,Middle의 값이 들어있다.

CREATE TABLE M_ORD_AMT_TP
(
    ORD_AMT_TP VARCHAR2(40) NOT NULL,
    FR_AMT NUMBER(18,3) NULL,
    TO_AMT NUMBER(18,3) NULL

);

CREATE UNIQUE INDEX PK_M_ORD_AMT_TP ON M_ORD_AMT_TP(ORD_AMT_TP);

ALTER TABLE M_ORD_AMT_TP ADD CONSTRAINT PK_M_ORD_AMT_TP PRIMARY KEY(ORD_AMT_TP ) USING INDEX;

INSERT INTO M_ORD_AMT_TP(ORD_AMT_TP, FR_AMT, TO_AMT)
SELECT 'Low Order',0,3000 FROM DUAL UNION ALL
SELECT 'Middle Order',3000,5000 FROM DUAL UNION ALL
SELECT 'High Order',5000,99999999 FROM DUAL;

 

SELECT T1.ORD_ST, T2.ORD_AMT_TP, COUNT(*) ORD_CNT
FROM T_ORD T1, M_ORD_AMT_TP T2
WHERE NVL(T1.ORD_AMT,0) >= T2.FR_AMT
AND NVL(T1.ORD_AMT,0) < T2.TO_AMT
GROUP BY T1.ORD_ST, T2.ORD_AMT_TP
ORDER BY 1,2;

 

이제 주문금액 테이블과 RANGE JOIN을 통해 값의 범위에 따라 HIGH,LOW,MIDDLE를 손쉽게 나타낼 수 있다.

 


참고자료 

https://www.yes24.com/Product/Goods/82818767

 

SQL BOOSTER - 예스24

SQL BOOSTER는 프로젝트 성공을 위한 SQL 필독서다. 이 책은 마치 프로젝트를 진행하는 순서처럼 구성되어 있다. 프로젝트 투입을 위해 필요한 SQL 기술을 설명하고, 성능 테스트를 위해 필요한 기술

www.yes24.com