SQL쿼리 질문드립니다..!!(수정) 0 4 2,198

by sam [SQL Query] [2013.01.28 08:19:49]



안녕하세요. 주말 잘보내셨나요?^^
월요일 아침부터.. 쿼리 질문드립니당 ㅎ
테이블 하나 더 있는게 중요해서... 수정했습니다 ㅜ 테이블 추가됨..

a,b,c 테이블을 조인하는데  c테이블에 idx가 a테이블에 있으면서, b테이블의 특정필드의 값이 없는 것만 가져오고 싶습니다.

구조는 대략

A테이블 B테이블 C테이블
idx idx2 name idx idx2 b_name idx
1 1 이름1 1 1 b이름1 1
2 1 이름2 3 1 b이름3 2
3 1 이름3 4 1   3
3 2 이름33       4
4 1 이름4
4 2 이름44
5 1 이름5
결과
idx idx2 name b.idx b.idx2 b_name
2 1 이름2 2
3 2 이름33 3
4 1 이름4 4 1
4 2 이름44


결과처럼 나오길 원합니다..

a와b테이블의 구조는 동일하다고 보면됩니다.. 

b테이블에는 a테이블과 매칭되는 데이터가 있을수도 있고, 없을 수도 있어서 outer 조인을 했습니다..


select a.idx, a.name, b.idx, b.b_name
from a,b
where EXISTS (SELECT   'T'
   FROM   c
  WHERE   a.idx = c.idx)
a.idx = b.idx(+)
and a.idx2 = b.idx2(+)
and  b.b_name is null

이런형태로 작업했는데 질문은

1. a 테이블에 데이터가 엄청 많다고 가정했을 때 퍼포먼스에 문제가 없을까요?
2. 조인 후에 조인한 테이블의 특정필드에 값이 없는 것만 가져올 경우 어떤방식으로 처리해야 좋을까요. (퍼포먼스를 1순위로..)

좋은하루 되십시요~^^
by 마농 [2013.01.28 10:03:55]
-- Exists 는 중복자료가 많은데도 1개만 읽어도 될때 유용하구요.
-- 이 경우엔 중복되지 않고 유니크하므로 Exists 보다는 조인이 나을듯
SELECT a.*
     , b.*
  FROM a, b, c
 WHERE c.idx  = a.idx
   AND a.idx  = b.idx (+)
   AND a.idx2 = b.idx2(+)
   AND b.b_name IS NULL
;

by sam [2013.01.28 14:39:05]
마농// is null 을 쓰면 느릴까봐 그랬는데 괜찮은가보군요..   exists 사용에 대한 설명 감사드립니다.
위 같은 경우에서 혹시 다른방법으로 값 없는 데이터 가져오는 방법도 있을까요 ?

by 마농 [2013.01.28 15:26:12]

a 와 c 는 어차피 조인해야 할것이고...
b 에 없는 것 찾는 방법은 다음 방법들을 생각할 수 있구요.
1. MINUS
2. NOT IN
3. NOT EXISTS
4. OUTER JOIN & IS NULL
4번 방법이 그나마 제일 낫지 않나 생각됩니다.


by sam [2013.01.28 16:08:10]

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