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

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은 아래와 같았습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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를 해버렸습니다.

아래처럼요.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
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]
1
2
3
4
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() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입