3개 테이블 Outer Join 관련 질문입니다 1 3 9,801

by 배주완 [SQL Query] Outer Join [2013.12.26 15:26:24]


SELECT *
 FROM a, b, c
 WHERE a.keycode  = 'A'
  AND b.keydt(+) = a.keydt
  AND c.usernm(+) = b.usernm


b 테이블은 a 테이블에 아우터로 붙어있구요,

c 테이블은 b 테이블에 아우터로 붙어있는 쿼리입니다.


b 테이블에 데이터가 있으면 c 테이블도 함께 조회되고,

b 테이블에 데이터가 없으면 c 테이블은 조회가 안되게 하는게 목적이구요,

걍 왠지 이렇게하면 될거 같아서 짜보긴 했는데

원하는대로 결과가 나오긴 하네요.



그런데 Oracle Outer Join 할 때는 하나라도 (+) 가 붙지 않으면 Inner Join 이 되는 걸로 알고 있는데,

c.usernm(+) = b.usernm

이 구문에서 b 테이블에는 (+)가 붙지 않았는데도

a 와 b 의 관계에서는 정상적으로 b 가 아우터로 동작하는군요.

c 입장에서 보면 b 의 아우터를 '계승' 받았다고 볼 수도 있을 것 같구요.


현재 11g 를 사용중인데, 이게 정상적인 문법인지 궁금해서 이렇게 질문을 남깁니다.



아무리 검색해도 3개 테이블 이상 Outer Join 에 관련된 내용은 잘 찾을 수가 없더라구요.
by 마농 [2013.12.26 15:55:08]

흔히들 착각하는 내용인데요. 정상적으로 잘 사용하신것 맞습니다.
테이블과 테이블과의 관계는 한번에 a:b:c 로 동작하는게 아닙니다.
a:b 관계와 b:c 관계가 각각 따로 입니다.
b에 아우터 조인 하는건 a:b 와의 관계에서 하는 것이지
b:c 관계에서의 아우터 조인이 아니므로 b:c 조건에 b에 (+)가 붙으면 안되지요.


말씀하신 하나라도 (+) 가 붙지 않으면 Inner Join 이 되는 건 다음 경우에 해당하는 얘기지요.
 AND b.keydt(+) = a.keydt
 AND b.usernm = 'aaa' -- 여기에도 (+) 가 붙어야 한다는...


by 임상준 [2013.12.26 16:26:59]

상수(변수)조건에 하나라도 (+) 가 붙지 않으면 Inner Join 이 되는건... 아마
개념이 필터링을 하고서 아우터 조인을 하느냐, 아우터 조인을 하고 필터링을 하느냐의 차이인것 같습니다.
group by 에서 having 이냐 where 냐의 차이처럼요...


by 윤압 [2013.12.26 18:13:53]
두분 모두 감사합니다.
그동안 아리송하던걸 확실히 알게 되었네요!:)
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입