쿼리질문 0 4 1,416

by BadGod [SQL Query] [2017.02.02 15:59:31]


SELECT c.cust_id, c.cust_name, c.cust_cat, m.mgr_id, c.cemail1, c.cemail2,    
    m.name, m.mgr_cat, m.memail1, m.memail2    
    FROM cust_tbl c    
      LEFT OUTER JOIN mgr_tbl m    
      ON c.cust_id = m.cust_id    
WHERE c.cemail1    
           IN(SELECT e.cemail1    
                FROM cust_tbl e    
                    WHERE e.cemail1 IS NOT NULL    
                                  AND NOT REGEXP_LIKE (e.cust_cat, 'L|N|Q')    
                                  AND NOT REGEXP_LIKE (m.mgr_cat, 'L|N|Q'))    
           OR    
           c.cemail2    
           IN(SELECT e.cemail2    
                FROM cust_tbl e    
                    WHERE e.cemail2 IS NOT NULL    
                                  AND NOT REGEXP_LIKE (e.cust_cat, 'L|N|Q')    
                                  AND NOT REGEXP_LIKE (m.mgr_cat, 'L|N|Q'))    
           OR    
           m.memail1    
           IN(SELECT d.memail1    
                FROM mgr_tbl d    
                    WHERE d.memail1 IS NOT NULL    
                                  AND NOT REGEXP_LIKE (d.mgr_cat, 'L|N|Q')    
                                  AND NOT REGEXP_LIKE (c.cust_cat, 'L|N|Q'))    
           OR    
           m.memail2    
           IN(SELECT d.memail2    
                FROM mgr_tbl d    
                    WHERE d.memail2 IS NOT NULL    
                                  AND NOT REGEXP_LIKE (d.mgr_cat, 'L|N|Q')    
                                  AND NOT REGEXP_LIKE (c.cust_cat, 'L|N|Q'))    
;    
    

1) CUST_CAT과 MGR_CAT에 L,N,Q가 없고 CEMAIL1, CEMAIL2, MEMAIL1, MEMAIL2가 NULL이 아닌 것만 위 코드의 둘째 라인까지의 컬럼에 해당하는 값 SELECT하기 입니다.    
2) 위 코드를 실행하면 약 40분 소요되는데 단축 방법은 없나요?    
3) 위 코드 실행하면 "MGR_CAT" 컬럽의 "L,N,Q가 없는 이멜일이 보여야 하는데, 간혹 L,N,Q 값이 있는 이메일도 SELECT 되는데 해결책은 없을까요?    
4) 위 코드를 간단하게 할 수 없을까요?    
    
테이블 구성    
CUST_TBL    
    CUST_ID
    CUST_NAME
    CUST_CAT
    CEMAIL1
    CEMAIL2
    
MGR_TBL    
    MGR_ID
    NAME
    MGR_CAT
    MEMAIL1
    MEMAIL2
    
*하나의 CUST_ID에는 하나 이상의 MGR_ID가 연결되어 있습니다.    
 

by 마농 [2017.02.02 16:45:06]

1. 동일 테이블을 서브쿼리에서 사용하는데?
  - 서브쿼리 없이 그냥 메인에 조건 줘도 될 듯 합니다.
2. mgr_cat, cust_cat 에는 데이터가 어떤 형태로 들어가 있나요?
  - 해당 조건의 의미가 궁금합니다.
3. 아우트 조인을 했으나?
  - Where 절에서 다시 조건으로 걸러내네요.
  - 이러면 아우터 조인은 무효입니다.
  - 이럴거면 이너조인 하는게 맞습니다.


by BadGod [2017.02.02 16:49:40]

먼저, 마농님의 답변에 감사드리구요.

CUST_CAT, MGR_CAT에는

약10자리의 임의 알파멧조합입니다.

예를들어 "ABCDEDFGHI"이런 식입니다.


by 마농 [2017.02.02 16:55:19]
SELECT *
  FROM cust_tbl c
 INNER JOIN mgr_tbl m
    ON c.cust_id = m.cust_id
 WHERE NOT REGEXP_LIKE (m.mgr_cat , 'L|N|Q')
   AND NOT REGEXP_LIKE (c.cust_cat, 'L|N|Q')
   AND c.cemail1 || c.cemail2 || m.memail1 || m.memail2 IS NOT NULL
;

 


by BadGod [2017.02.02 16:58:07]

마농님은 마술사십니다.^^

새해 복많이 받으세요.

감사합니다.^^

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