테이블 셀렉트 결과를 다른 테이블을 이용, 필터링하는 방법에 대한 질문입니다. 0 2 4,042

by 수박남자 [SQL Query] SQL JOIN WHERE [2012.08.23 00:55:41]


간략하게 상황을 설명드리자면
TARGET TABLE에 TBL_AA 에서 값을 가져와  INSERT 하는데 데이터에서 문제가 있어
TBL_A와 TBL_B를 조인한 결과 (를 이용, TBL_AA에서 문제가 있는 데이터를 걸러내려 했습니다.

즉 TBL_AA.PRB1, TBLAA.PRB2  두 컬럼의 값이 TBL_BB.FILTER_VALUE 칼럼의 값 안에 있어야 합니다.

기본적으로 생각했던 SQL은 아래와 같았습니다.

  INSERT INTO TARGET_TABLE
   (
    ID, 
    COL_A,
    COL_B,
    PRB_1,
    PRB_2,
   )  
  SELECT 
    AA.ID  ID , 
    AA.COL_A  COL_A,
    AA.COL_B  COL_B,
    AA.PRB_1  PRB_1,
    AA.PRB_2  PRB_2,
  FROM TBL_AA AA,
    (SELECT A.CD FILTER_VALUE
    FROM TBL_A A
    WHERE A.ID = 'ID'
     AND EXISTS (SELECT 'X' 
         FROM TBL_B B
         WHERE A.CD = B.ID
          AND A.COL_A = B.COL_A
         )) TBL_BB
  WHERE AA.PBR1 IN TBL_BB.FILTER_VALUE
   AND AA.PRB2 IN TBL_BB.FILTER_VALUE

그런데 WHERE 절의 조건이 하나인 경우는 결과가 정상적으로 나오지만 AND로 묶은 결과는
계속 NULL 이 나오더라구요.

즉   WHERE AA.PBR1 IN TBL_BB.FILTER_VALUE 이거나  WHERE AA.PRB2 IN TBL_BB.FILTER_VALUE
인 경우는 정상적으로 값이 들어오지만 반쪽 결과여서 쓸모가 없고, AND로 묶는 경우는
NULL 이 나오는 상황이었습니다.

자포자기삼아 OR을 써보기도 했는데 결과는 의미없음. 이었구요. ㅠ_ㅜ

결국 현재는 각각의 결과를 만들어 INTERSECT를 해버렸습니다.

아래처럼요.

   INSERT INTO TARGET_TABLE
      (
       ID, 
       COL_A,
       COL_B,
       PRB_1,
       PRB_2,
      )    
   (SELECT 
       AA.ID   ID  , 
       AA.COL_A   COL_A,
       AA.COL_B   COL_B,
       AA.PRB_1   PRB_1,
       AA.PRB_2   PRB_2,
    FROM TBL_AA AA,
       (SELECT A.CD FILTER_VALUE
        FROM TBL_A A
        WHERE A.ID = 'ID'
          AND EXISTS (SELECT 'X' 
                  FROM TBL_B B
                  WHERE A.CD = B.ID
                   AND A.COL_A  = B.COL_A
                 )) TBL_BB
    WHERE AA.PBR1 IN TBL_BB.FILTER_VALUE
    INTERSECT
    SELECT 
       AA.ID   ID  , 
       AA.COL_A   COL_A,
       AA.COL_B   COL_B,
       AA.PRB_1   PRB_1,
       AA.PRB_2   PRB_2,
    FROM TBL_AA AA,
       (SELECT A.CD FILTER_VALUE
        FROM TBL_A A
        WHERE A.ID = 'ID'
          AND EXISTS (SELECT 'X' 
                  FROM TBL_B B
                  WHERE A.CD = B.ID
                   AND A.COL_A  = B.COL_A
                 )) TBL_BB
    WHERE AA.PRB2 IN TBL_BB.FILTER_VALUE)
   ;

  ;
 
해결은 되었는데, 성능도 구리고 무엇보다 쿼리가 너무 안좋습니다.
바로잡고 싶은데 아무리 생각해도 떠오르지가 않아서요.

도움을 요청드립니다. ㅠ_ㅜ

감사합니다.

by 오케클릭 [2012.08.23 10:35:45]
 
WHERE AA.PBR1 IN TBL_BB.FILTER_VALUE AND AA.PRB2 IN TBL_BB.FILTER_VALUE 
--요부분을 
WHERE (AA.PBR1,AA.PRB2) IN ((TBL_BB.FILTER_VALUE ,TBL_BB.FILTER_VALUE)) 
--이렇게 바꾸면 되지 않나요?

by 수박남자 [2012.09.02 15:03:52]

확인해보는게 너무 늦었습니다. 죄송합니다. ㅠ_ㅜ

답변에 감사드립니다.  그런데 확인해보니 정상적이면 70 ROW 정도가 결과로 나와야 하는데 NULL 이 나오네요...

다른 방법을 찾아봐야 할 것 같습니다.

감사합니다.

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