서브쿼리 2 depth 되는 예시 좀 알려주세요. 0 1 1,111

by 이기락 [SQL Query] 서브쿼리 2 Depth 중첩 서브쿼리 [2020.10.07 21:37:45]


특정 쿼리를 튜닝 하고 싶은건 아니고요.

업무상 여러 개발자가 만든 쿼리를 

서브 쿼리에 넣어서 쿼리 해야 하는 상황입니다.

예를 들어 전체 쿼리의 형태를 보자면

=====기본 쿼리 베이스========

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의 서브 쿼리 처리 하는 예시 같은거 
있으면 링크라도 좀 부탁 드립니다. ^^

비슷하지 않아도 상관 없습니다.
영감(靈感) 이라도 좀 받으면 되니까요. ㅋ

by 마농 [2020.10.08 07:59:58]

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)

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입