SQL ZOO[MySQL]Self join

2022. 3. 29. 03:36Site/SQL ZOO

self join : 같은 테이블을 조인 -> 테이블내의 여러개의 컬럼들이 연관관계가 있을때 활용됨

2개 이상의 동일한 테이블을 이용해서 조인을 해야되는데 동일한 테이블이라도 각자의 역할이 다름

 

stops 테이블, route 테이블
stop 테이블
route 테이블

 

stops 테이블에 있는 정보 모두 조회

 

Craiglockhart의 id 조회
route의 num이 4이고 company가 LRT인 버스가 경유하는 지역의 id값과 지역 조회

stops 테이블의 id, name을 조회하고 num과 company의 조건을 수행하기 위해 stops과 route의 공통키인[id, stop]을 조인

London Road(149) 또는 Craiglockhart(53)를 방문하는 company, num, COUNT 조회

COUNT가 2라는 조건을 추가해야 되므로 company, num을 그룹화하여 HAVING문에 조건 추가

Craiglockhart에서 London Road를 경유하는 company, num, stop 조회

Craiglockhart와 London Road를 경유하는 정보를 알기 위해서는 route테이블의 stop컬럼이 필요한데 각 1개씩 밖에 들어있지 않음 -> self join을 사용하여 route a, route b 2개의 테이블을 생성해서 각각의 stop의 정보를 2개씩 접근이 가능함

지역이 Craiglockhart, London Road를 경유하는 company, num, name 조회

이번에는 5번과 달리 숫자가 아닌 문자열로 접근

self join으로 route a, b를 join하는 것은 동일하지만 name으로 조건을 주긴 위해서는 stops테이블의 name에 접근해야됨

-> 추가적으로 stops테이블의 stopa, stopb 2개의 테이블을 생성하여 조인하고 각각의 name에 접근해야됨

115번[Haymarket]을 경유하고 137번[Leith]을 경유하는 모든 company, num 조회

여기서는 DISTINCT를 활용함(self join한 route A와 route B의 테이블의 중복값 출력 방지)

Craiglckhart와 Tollcross를 경유하는 company, num 조회

6번과 비슷함

-> route 테이블을 self join하고 stops 테이블에 stopa, b을 각각 조인하여 name에 접근

하나의 버스를 타고 'Craiglockhart'에서 도달할 수 있는 정류장의 name, company, num 조회

Craiglockhart에 도달 수 있는 정류장을 알기 위해선 stop.name에 접근하여 값을 Craiglockhart로 주면 경유하는 모든 정류하는 알 수 있음

-> 마찬가지로 self join으로 route테이블을 조인하고 stop.name을 Craiglockhart 라는 문자열로 주기 위하여 추가적으로 stops 테이블을 조인하고 WHERE문에 stops의 name을 Craiglockhart 줌

 

 

 

 

 

 

self join이 마지막 답게 호락호락 보내주지 않는 것 같습니다

10번 문제는 삽질을 엄청했는데 아직 부족한 거 같아서 해결을 못했습니다

좀 더 공부하고 다시 풀어서 돌아오겠습니다...

'Site > SQL ZOO' 카테고리의 다른 글

SQL ZOO[MySQL]Self join Quiz  (0) 2022.03.29
SQL ZOO[MySQL]Using Null Quiz  (0) 2022.03.20
SQL ZOO[MySQL]Using Null  (0) 2022.03.20
SQL ZOO[MySQL]JOIN Quiz 2  (0) 2022.03.15
SQL ZOO[MySQL]More JOIN operations  (0) 2022.03.15