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