특정 쿼리를 튜닝 하고 싶은건 아니고요.
업무상 여러 개발자가 만든 쿼리를
서브 쿼리에 넣어서 쿼리 해야 하는 상황입니다.
예를 들어 전체 쿼리의 형태를 보자면
=====기본 쿼리 베이스========
WITH TB AS
( SELECT A,B,C FROM TABLE1)
SELECT A,B,C
FROM TB T
WHERE 1=1
AND [개발자들이 만든 쿼리]
=======================
여기서
[개발자들이 만든 쿼리] 는 "( SELECT COUNT(1) FROM 테이블2 TT WHERE TT.K =T.A )<1"
이런 형태 이고요
[개발자들이 만든 쿼리] 쿼리가 일반적인 형태는 상관 없는데.
서브쿼리가 있는 쿼리가 들어 오면 서브 쿼리가 2Depth 가 되어 에러가 납니다.
[예] "( SELECT COUNT(1)
FROM (SELECT 1 FROM 테이블3 P WHERE P.C =T.C
UNION ALL
SELECT 1 FROM 테이블5 PP WHERE PP.C =T.C ))<1"
방법이 없을까요? 2Depth의 서브 쿼리 처리 하는 예시 같은거
있으면 링크라도 좀 부탁 드립니다. ^^
비슷하지 않아도 상관 없습니다.
영감(靈感) 이라도 좀 받으면 되니까요. ㅋ
2단계 서브쿼리 안으로 메인 컬럼이 들어갈 수는 없습니다.
1단계 안에서 처리하는 방법을 찾아야 합니다. 위 쿼리도 1단계로 충분히 가능합니다.
또한 COUNT 로 비교하기 보다는 EXISTS 를 사용하는게 좋을 듯 합니다.
-- 1. 조건절을 밖으로 빼는 방법 (SELECT COUNT(1) FROM (SELECT c FROM 테이블3 UNION ALL SELECT c FROM 테이블5 ) p WHERE p.c = t.c ) < 1
-- 2. COUNT < 1 대신 NOT EXISTS 사용 NOT EXISTS (SELECT 1 FROM 테이블3 p WHERE p.c = t.c UNION ALL SELECT 1 FROM 테이블5 p WHERE p.c = t.c )
-- 3. UNION ALL 을 두개의 조건으로 분리하는 방법 -- 3.1 COUNT (SELECT COUNT(*) FROM 테이블3 p WHERE p.c = t.c) < 1 AND (SELECT COUNT(*) FROM 테이블5 p WHERE p.c = t.c) < 1 -- 3.2. EXISTS NOT EXISTS (SELECT 1 FROM 테이블3 p WHERE p.c = t.c) AND NOT EXISTS (SELECT 1 FROM 테이블5 p WHERE p.c = t.c)