두 개의 select문의 차이를 설명해주세요 0 5 2,037

by 김종만 [2005.03.15 13:51:39]


[sql 1]

select b.emp_no, b.emp_nm, a.tot_pay, a.pay_nm  from  
       (select a.emp_no, a.emp_nm, a.tot_pay, a.pay_nm from payt070 a
         where yymm=200503
     and paygbn = 2) a, payt040 b, emptmpe c
where b.emp_no = a.emp_no(+)
  and b.emp_no = c.empno

[sql 2]

select b.emp_no, b.emp_nm, a.tot_pay ,a.yymm,a.paygbn
 from  payt070 a, payt040 b
where b.emp_no = a.emp_no(+)
  and a.yymm=200503
  and a.paygbn =2

 

세개의 테이블이 있습니다.

emptmpe , payt040 , payt070

emptmpe와 payt040에는 반드시 있어야 하고, payt070에는 값을 있으면 가지고 오고, 없으면 표시 안 되게 하고 싶어서, 언뜻 만들어 낸 문장이 [sql 2]였습니다.

원하는 결과가 아니더군요.

그래서, 이래저래 하다보니 [sql 1]문장이 나왔습니다.

결과를 보고 납득은 가지만 좀 더 자세한 설명을 부탁드립니다.

by 허저비 [2005.03.15 00:00:00]
맞는 지는 몰겠습니다만, 짧은 지식으로..
(+)와 같은 OUTER JOIN 조건은 모든 조건, 즉 말하자면 아래쪽의 AND 로 시작되는 문장에도 붙여야 되는 걸로 압니다.

그리고, 1)번이 훨씬 빠른 결과를 얻을 수 있을 것 같습니다. 범위를 좁혀서 조인하는게 좀 더 �

by 마농 [2005.03.15 00:00:00]
실수하기 쉬운 부분이네요..
아웃조인 건 테이블에 다른 조건을 주면 아웃조인은 무의미합니다.

by MUR [2005.03.17 00:00:00]
where b.emp_no = a.emp_no(+)
and a.yymm(+) = 200503
and a.paygbn(+) = 2
SQL2를 이렇게 고쳐주셔야 SQL1과 같은 문장이 됩니다.

by MUR [2005.03.17 00:00:00]
a.yymm = 200503 은 a.yymm이 200503인 값만 취하겠다는 뜻으로 payt070에 해당값이 있더라도 a.yymm이 200503이 아니면 걸러내겠죠.. 원래 아우터조인의 의미를 망가뜨린다는 거죠..

by 김종만 [2005.04.01 00:00:00]
좋은 답변 감사합니다.
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입