-
SQLBOOSTER - RANGE JOINDataBase/SQL 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
'DataBase > SQL' 카테고리의 다른 글
SQL BOOSTER - 단일 인덱스 (0) 2024.06.12 성능 개선을 위한 기본 지식 - 실행 계획 (0) 2024.06.06 SQLBOOSTER - INNER JOIN (0) 2024.06.04 SQL BOOSTER - 소계 구하기 ROLLUP, UNION ALL, 카테시안 조인,CUBE,GROUPING SETS (0) 2024.06.03 SQL BOOSTER - GROUP BY와 ROLLUP (0) 2024.06.02