조인이 너무 어렵고 이해가 안갑니다.. 2 8 2,993

by 병기태 오라클 조인 셀프조인 join self join 조인 [2015.09.15 10:06:28]


오라클 공부를 하고 있는데

아래와 같은 문제가 있었습니다.

 

문제) 인사정보테이블과, 조직테이블이 있다.

    이때 각 사원별 조직장의 정보를 출력하라.

[인사정보 - 사원코드, 사원이름, 조직코드  등...]

[조직 - 조직코드, 조직명, 조직장번호 등...]

 

그리고 저는 이문제의 답을

SELECT A1.사원코드, A1.사원이름, B,조직코드, B.조직장번호
    FROM 인사정보 A1,
         조직정보 B
    WHERE A1.조직코드 = B.조직코드

 

 
이렇게 생각하였습니다. 그러나 정답은
 

SELECT A1.사원코드, A1.사원이름, B,조직코드, B.조직장번호
    FROM 인사정보 A1,
         인사정보 A2,
         조직정보 B
    WHERE A1.조직코드 = B.조직코드
      AND B.조직장번호 = A2.사원코드;

이거 였으며, 저에게는 아직도 생소한 같은테이블을 두개로 나누어 FROM한 것입니다...

 

찾아보니 셀프조인이라는 개념이 나와 검색해보고는 있는데

자기 자신끼리 WHERE절을 만든경우뿐이 없어 이문제의 이해는 아직도 가질 않는 상황입니다..ㅠㅠ

 

by 마농 [2015.09.15 10:17:46]

정답쿼리에 조직장이름이 빠져 있네요.
조직장 번호는 키 역활로써는 중요한 것이지만 정작 보여줄 때는 의미 없는 값이죠.
출력할때는 이름을 보여 줘야 합니다.
사원테이블의 조직코드를 이용해 조직테이블과 조인하는 거구요
조직테이블의 조직장 사번을 이용해 조직장 이름을 가져오기 위해 사원정보와 다시 조인하는 것입니다.
 - A1 은 사원의 정보를 가져오기 위한 것이고
 - B  는 조직의 정보를 가져오기 위한 것이고
 - A2 는 조직장의 정보를 가져오기 위한 것이죠.
 

SELECT A1.사원코드
     , A1.사원이름
     , A1,조직코드
     , B,조직명
     , B.조직장번호
     , A2.사원이름 AS 조직장이름
  FROM 인사정보 A1
     , 인사정보 A2
     , 조직정보 B
 WHERE A1.조직코드 = B.조직코드
   AND B.조직장번호 = A2.사원코드
;

 


by 병기태 [2015.09.15 10:26:43]

같은 테이블을 두번 조회하는 이유가 조직장의 이름을 뽑아내기 위함인가요?

하나로 조회하고

B.조직장번호 = A1.사원코드 이렇게 바꾸는 것은 왜안되는 건지 알 수 있을까요?

그리고 이것을 셀프조인이라하나요?


by 개발뉴비 [2015.09.15 10:35:23]

조직 테이블에 조직장 명 컬럼이 있다면 상관 없겠지만...

조직장 명 컬럼이 없다면 인사정보 테이블에 조직장번호를 JOIN하여 표시해야하기 때문입니다.


by 마농 [2015.09.15 10:34:56]

그렇게 조인하면 여러명의 부서원중에 조직장 1명만 조회됩니다.
즉 조직장인 사원을 출력하는 문제의 답이죠.
사원의 조직장을 출력하는 문제의 답은 아니죠.


다시 정리하면
사원의 정보를 조회하는데...A1
조직장의 사번 정보가 없어서 조직테이블과 조인하여 조직장 사번을 가져옵니다.
그런데 조직장의 신상정보가 없죠.
조직장의 이름을 가져옥 위해서는 다시 사원테이블과 조인해야 합니다...A2
같은 사원테이블이지만 쓰임새가 다릅니다.
A1 은 사원의 신상정보, A2는 조직장의 신상정보


by 병기태 [2015.09.15 10:40:54]

오! 좀 이해됬습니다. 감사합니다


by 병기태 [2015.09.15 11:01:32]

그리고 추가적으로 여쭤볼게 있는데요

위와같이 같은테이블을 두번 선언하는 목적중 속도 향상을 위한 목적도 있나요?

 

다름이 아닌 어떠한 쿼리를 실행하였는데 약 6천개의 데이터가 조회되는 쿼리였습니다.

두번선언했을시 금방되었고, 한번선언했을시 20~30초이상이 걸렸었고, 조회되는 수는 동일하였어서

이런 질문을 하게되었습니다.


by jkson [2015.09.15 11:23:21]

한 번 선언한 쿼리를 먼저 돌리고 두 번 선언한 쿼리를 돌린 거라면 캐시에 남아있는 정보를 이용했을 것 같네요.


by 마농 [2015.09.15 11:16:04]

같은테이블을 두번 선언하는 목적중 속도 향상을 위한 목적은 없습니다.
 - 단순히 두번 필요하기 때문에 사용하는 거구요.
한번 사용해도 되는데 두번 사용했다면?
 - 잘못 사용했을 가능성이 있구요.
 - 잘못은 아니지만 비효율일 가능성이 있구요.
 - 또는 속도향상을 위한 기교를 부린 것일 수도 있네요.

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