• 카테고리

    질문 & 답변
  • 세부 분야

    데이터베이스

  • 해결 여부

    해결됨

조인관련 문의

23.02.12 14:53 작성 조회수 361

1

안녕하세요. 조인관련 실습을 하다가 궁금한점이 있어 문의드립니다.

-- 직원명 SMITH의 과거 소속 부서 정보를 구할 것.

 

예제를 실행하려다 보니 저의 경우

일단 가장먼저 보이는 emp와 dept 테이블을 join하고

(JOIN순서는 상관 없다고 하셔서..)

나머지 테이블인 emp_dept_hist 테이블을 연결해주려 하다보니 아래와 같은 join 조건을 쓰게 되고 당연히 결과가 다르게 나오더라구요.

결과를 알고 보니 emp와 dept 테이블을 연결 안해야 하는게? 맞는거 같긴한데..

제가 여러 테이블을 조인할때 어느 부분을 놓치고 있는 걸까요? ㅜ

(ANSI가 아직 익숙하지 않아 일단 기존 방식으로 쿼리를 작성했습니다..)

 

 

SELECT a.ename , c.fromdate , c.todate , b.deptno , b.dname

FROM emp a, dept b, emp_dept_hist c

WHERE a.deptno = b.deptno

AND a.empno = c.empno

AND b.deptno = c.deptno

AND a.ename = 'SMITH'

;

답변 2

·

답변을 작성해보세요.

1

안녕하십니까,

네, 말씀하신대로 emp와 dept 테이블을 연결하면 원하는 결과를 얻을 수 없습니다.

처음 조인을 배울 때는 여러개의 테이블을 조인할 때 모든 테이블의 키값을 모두 조인으로 연결해야 할 것 같은 부담(?)이 떠오르는게 당연합니다.

그래서 늘 여러개의 조인을 할때는 차근차근 2개의 테이블씩 조인하면서 집합의 레벨을 생각하는 연습을 계속해서 버릇처럼 들여야 합니다.

가령 A, B , C, D 테이블을 조인하면 A와 B의 조인 결과는 어떤 집합 레벨이 되고, 조인 결과 집합(X라고 하면)과 C 테이블을 조인하면 어떤 집합 레벨이 되고, 이 조인 결과 집합(Y라고 하면)과 D 테이블이 조인되면 어떤 집합레벨이 되고, 최종적으로 우리가 원하는 결과가 되는지 차근차근 따져(?) 보는 시간을 가져 보는게 좋습니다. 처음엔 이게 시간이 걸릴 수 있지만, 이렇게 하지 않으면 조인 실력이 늘기 어렵습니다. 조금만 이런식으로 하시다보면 금방 여러개의 테이블 조인도 거뜬히 수행 할 수 있는 실력이 될 수 있습니다.

다시, 왜 결과가 다른가를 보면 emp와 dept 테이블을 조인하게 되면서 결과가 변했습니다. 그러니까 emp와 dept를 조인하기 전에는 SMITH 직원에 대한 원래 조인은 SMITH 과거 어떤 부서에 있었는지, 즉 두개의 부서, 과거 부서와 현재 부서에 대한 정보를 추출할 수 있었습니다. 하지만 수행하신 쿼리는 이 결과 집합에 현재 부서 정보만 또 조인으로 연결하게 되면서 결과가 달라지게 됩니다.

아래와 같은 SQL을 수행해 보십시요. 기존 쿼리에서 WHERE 조건에 emp와 dept 테이블 조인을 제거했고, select 절에 a.deptno를 추가했습니다. 결과로 나오는 a.deptno를 확인해 보시면 b.deptno와 다른 걸 알 수 있습니다. a.deptno는 20만 가지고 있지만 d.depno는 과거 부서 30, 20을 가지고 있습니다. 이렇게 다른 결과 a.deptno = b.deptno로 조인을 해버리면 조인 되지 않는 과거 부서 30이 빠지게 되면서 결과가 달라집니다.

SELECT a.ename, a.deptno, b.deptno, c.fromdate , c.todate , b.deptno , b.dname

FROM emp a, dept b, emp_dept_hist c

WHERE a.empno = c.empno

AND b.deptno = c.deptno

AND a.ename = 'SMITH'

;

 

감사합니다.

0

장보현님의 프로필

장보현

질문자

2023.02.13

친절한 답변 감사합니다! 답변을 보니 그동안 제가 잘 몰랐던 두가지가 첫번째로 조인시 모든 키값들을 연결해야하는줄 알았습니다.. 그리고 두번째는 emp_dept_hist 테이블 처럼 M(emp):N(dept) 레벨의 테이블은 조인으로 어떻게든 연결만해주면 자동으로 결과가 M:N 레벨이 되는줄 알았습니다.. 다시 제가 푼 방식을보니 기존에 저는 emp a, dept b 조인을 통해 M(emp)레벨을 만들었고 이결과를 emp_dept_hist c와 조인시에도 결과는 M(emp) 레벨, 그리고 이것을 dept와 조인하더라도 EMP 레벨만 나왔던거 같습니다. 답변감사합니다!