1. 다중컬럼 조건에 대하여 기존 EXISTS 로 처리하는 방안 외에 인라인뷰로 조인하여 해결하는 방안입니다.
* CUBRID는 다중컬럼 조건처리를 지원하지 않으며, EXISTS 혹은 인라인 뷰를 통하여 다중컬럼처리를 할 수 있습니다.
* EXISTS는 메인쿼리의 true, false를 모두 구하여야 함으로, fetch, data scan 양이 증가합니다.
* 인라인뷰로 join 시 메인쿼리의 fatch, data scan 양을 최소화 할 수 있습니다.
2. TEST table 스키마
2-1. 스키마
CREATE TABLE cub_test1 (code1 VARCHAR(10), code2 VARCHAR(10), code3 VARCHAR(10));
CREATE TABLE cub_test2 (code1 VARCHAR(10), code2 VARCHAR(10), code3 VARCHAR(10));
2-2. 데이터
INSERT INTO cub_test1 VALUES ('1','code2_test','code3_test');
INSERT INTO cub_test1 VALUES ('2','code2_test','code3_test');
INSERT INTO cub_test1 VALUES ('3','code2_test','code3_test');
INSERT INTO cub_test1 VALUES ('4','code2_test','code3_test');
INSERT INTO cub_test1 VALUES ('5','code2_test','code3_test');
INSERT INTO cub_test1 VALUES ('6','code2_test','code3_test');
INSERT INTO cub_test1 VALUES ('7','code2_test','code3_test');
INSERT INTO cub_test2 VALUES ('1','code2_test','code3_test');
INSERT INTO cub_test2 VALUES ('2','code2_test','code3_test');
INSERT INTO cub_test2 VALUES ('3','code2_test','code3_test');
INSERT INTO cub_test2 VALUES ('4','code2_test','code3_test');
INSERT INTO cub_test2 VALUES ('5','code2_test','code3_test');
INSERT INTO cub_test2 VALUES ('6','code2_test','code3_test');
INSERT INTO cub_test2 VALUES ('7','code2_test','code3_test')
3. 유형별 SQL
3-1.ORACLE) 다중 컬럼 처리
SELECT a.code1, a.code2, a.code3 FROM cub_test1 a WHERE (a.code1, a.code2) IN (SELECT b.code1,b.code2 FROM cub_test2 b WHERE b.code1 = '1' AND b.code3 = 'code3_test' ) |
3-2.CUBRID_EXISTS 다중 컬럼 처리
SELECT a.code1, a.code2, a.code3 FROM cub_test1 a WHERE EXISTS (SELECT b.code1,b.code2 FROM cub_test2 b WHERE b.code1 = '1' AND b.code3 = 'code3_test' AND a.code1 = b.code1 AND a.code2 = b.code2 ) |
3-3.CUBRID_인라인뷰 다중컬럼 처리
SELECT a.code1, a.code2, a.code3 FROM cub_test1 a, (SELECT DISTINCT b.code1,b.code2 FROM cub_test2 b WHERE b.code1 = '1' AND b.code3 = 'code3_test' ) c WHERE a.code1 = c.code1 AND a.code2 = c.code2 |
일반적으로 IN 오퍼레이션 안쪽에 SUB QUERY가 데이터가 적을 경우가 많지만,
SUB QUERY의 데이터가 MAIN QUERY보다 많을 경우에는 EXISTS 사용이 효율적입니다.
테스트 스키마로 볼때 데이터 양이 cub_test1 > cub_test2 경우 JOIN 방법을
cub_test1 < cub_test2 경우 'exists' 오퍼레이션을 사용하면 효율적입니다.