hr 문제푸는중 아우터조인 질문드립니다 0 3 1,337

by 안쓰 [Oracle 기초] [2019.02.03 16:09:26]


안녕하세요

초급개발자로 쿼리 연습문제 푸는중 아우터 조인 질문드립니다 

(문제는 오라클 기본 hr 계정입니다)

--employees 사원테이블 

--departments 부서테이블

--locations 지역테이블

--countries 도시테이블

 

[문제]

    국가(country_name) 별 도시(city)별 직원수를 조회하시오
    단, 부서에 속해있지 않은 직원 이 있기 때문에 106명의 직원만 출력이 된다
    부서정보가 없는 직원은 국가명과 도시명 대신에 ‘<부서없음>’이 출력되도록 하여 107명 모두 출력되게 한다

 

[답] -- 테이블 아우터 조인부분만 

FROM
    employees     e
    LEFT JOIN departments   d ON e.department_id = d.department_id
    LEFT JOIN locations     l ON d.location_id = l.location_id
    LEFT JOIN countries     c ON l.country_id = c.country_id
 

[질문]

제가 푼 쿼리는 사원테이블 기준으로 부서테이블만 아우터 조인을 맺고

--e.dpeartment_id = d.department_id(+)

부서 테이블과 지역테이블,도시테이블은 이너조인을 맺었습니다

--d.location_id = l.location_id

--l.country_id = c.country_id

이유는 부서가없는 사원테이블과 조인을 맺은것만으로 조건이 완료되었다고 생각했는데요

답을보면

사원을 기준으로 부서로 아우터조인,

부서를 기준으로 지역과 아우터조인,

지역을 기준으로 도시와 아우터조인

 

이런식으로 아우터조인이 진행됩니다

사원과 부서테이블외에 나머지테이블이 아우터조인이 맺어져야하는지 이유를 모르겠습니다

혹시 알려주실분 계실까요? ㅜㅜ

 

[질문2]

조인시 실행 순서에대해 잘못이해하고있는지 여쭤봅니다.

첫번째 조인인 사원 기준으로 부서를 아우터로 걸면

부서가없는 전체 사원 107명이 조회되고

그결과를 갖고

107개의 부서테이블과 지역테이블이 이너조인을 맺고

그결과를 갖고

지역테이블과 도시테이블이 다시 이너조인을 맺고

 

이런식으로 돌아가는게 아닌건가요??

 

감사합니다!

by jin [2019.02.06 20:55:41]

먼저 조건을 명확히 합니다.

 

사원 테이블 : 사원의 정보 및 사원이 소속된 부서 아이디를 포함한다.

부서 테이블 : 부서 정보 및 부서가 위치한 지역 아이디를 포함한다.

지역 테이블 : 지역 정보 및 지역이 어느 도시에 소속되어 있는지 도시 아이디를 포함한다.

도시 테이블 : 도시 정보를 포함한다.

 

국가별, 도시별 직원 수를 구해야 합니다.

그런데 국가가 없네요. 지역별, 도시별 직원 수를 구해야 하는 문제 같습니다.

 

각각의 직원이 소속된 지역, 도시를 표시한 테이블을 출력하는 쿼리를 먼저 작성하고

이 쿼리에 지역, 도시별로 그룹화 한 후 직원 정보를 카운팅하는 쿼리를 추가해 주면 됩니다.

 

각각의 직원이 소속된 지역, 도시를 표시한 테이블을 출력하는 쿼리를 생각해 봅시다.

직원 아이디가 1,2,3,4,5가 있다고 합시다.

각각 아이디별로 매칭이 되는 부서가 판매, 연구, 사무가 있다고 합시다.

만약 매칭이 1-판매, 2-연구, 3-사무가 되면

원하는 결과는 1-판매, 2-연구, 3-사무, 4-null 이 되어야 합니다.

이것을 조인을 한다면

1-판매, 2-연구, 3-사무만 나오고 4-null은 나오지 않습니다.

레프트 조인을 하면

1-판매, 2-연구, 3-사무, 4-null가 나옵니다.

 

이제 각각의 부서가 속한 지역을 출력한다고 합시다.

그런데 테이블의 지역 중 일부가 빠져 있을 경우가 있을 수 있습니다.

매칭이 판매-강남구, 연구-해운대구, 사무-달서구라고 할 때

지역 테이블에는 달서구가 없을 경우가 있습니다.

이 경우를 고려해 주게 되면

판매-강남구, 연구-해운대구, 사무-null이라는 결과가 나와야 합니다.

그런데 조인을 하면

1-판매-강남구, 2-연구-해운대구만 나오게 됩니다.

레프트 조인을 하게 되면

1-판매-강남구, 2-연구-해운대구, 3-사무-null, 4-null-null이 나오게 됩니다.

 

도시 테이블과의 조인도 마찬가지입니다

매칭이 강남구-서울, 해운대구-부산, 달서구-대구라고 했을 때,

도시 테이블에 부산과 대구가 없다고 합시다. 그러면

조인을 하면

1—판매-강남구-서울만 나옵니다.

레프트 조인을 하면

1—판매-강남구-서울, 2-연구-해운대구-null, 3-사무-달서구-null, 4-null-null-null이 나옵니다.

 

질문 1

먼저 지역 테이블에 해당 부서가 속한 모든 지역이 표기되어 있는지 확인합니다. 지역 중 부서와 매칭이 되지 않는 것이 있다면 조인하게 되면 매칭되지 않는 부서가 쿼리 결과에서 사라진다는 점을 떠올려야 합니다.

마찬가지로 도시 테이블에도 해당 지역이 속한 모든 도시가 표기되어 있는지 확인하고 매칭되지 않는 것이 있다면 조인을 할 시 도시가 쿼리 결과에서 사라진다는 것을 알아야 합니다.

 

문제에 나온 조건뿐만 아니라 테이블에 어떤 데이터가 들어 있는지도 살피세요.

 

질문2

사원 테이블에 부서를 레프트 조인하면

1-판매, 2-연구, 3-사무, 4-null이 됩니다.

이 결과에 지역을 조인하면 어떻게 될까요?

원하는 결과는

1-판매-강남구, 2-연구-해운대구, 3-사무-null, 4-null-null 이어야 합니다.

하지만 조인을 하게 되면

1-판매-강남구, 2-연구-해운대구로 지역 테이블에서 연결될 수 있는 값이 없다면 사라집니다.

따라서 레프트 조인을 해야 합니다.

 

추가

부서, 지역, 도시 테이블을 조인으로 묶으면

판매-강남구-서울만 남게 됩니다.

이것을 사원 테이블에 레프트 조인을 하게 되면

1-판매-강남구-서울

2-null-null-null

3-null-null-null

4-null-null-null

이 나오게 할 수 있습니다.

사원의 수 106명은 카운팅 할 수 있어야 하므로 어떤 조인을 하더라도 사원 수가 줄어들게 해서는 안 됩니다.

 

그리고 select절에 지역과 도시에 null이면 부서없음으로 출력하게 조건을 걸어주면

각각의 직원이 소속된 지역, 도시를 표시한 테이블을 출력하는 쿼리를 만들 수 있습니다.

 

여기다 그룹화 한 뒤 카운팅 걸어주면 답을 구할 수 있습니다.


by 마농 [2019.02.07 08:21:25]

사원과 부서를 아우터 조인 하면, 부서가 없는 사원도 조회됩니다.
부서와 지역을 조인 할 때 부서가 없는 사원도 조인에 성공하려면?
지역을 아우터 조인 해야 하는 것입니다.
즉, 한번 아우터 조인을 하게 되면, 그 다음 조인은 연속적으로 아우터 조인을 해줘야 합니다.


by 안쓰 [2019.02.07 14:15:35]

by jin 님

한줄한줄 친절히 풀어 설명해주셔서 너무감사합니다

이제 조건을 데이터와 한줄한줄 비교해가며 풀수있을것같습니다

감사합니다~!

 

by마농 님 답변을 늦게확인하였는데 친절한답변 늘 감사드립니다!!

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