NLP Learner in Switzerland

View 구현 예제 본문

Database SQL/Exercise

View 구현 예제

초코빵 2021. 4. 27. 10:00
728x90
반응형

 

Mondial_database.pdf
0.07MB

 

 

 

[답]

1. view를 생성할 때는 create view ~ as를 사용한다. with ~ as는 temporary였지만 create view는 영구생성이므로 삭제해주지 않으면 계속 남아있다.

create view symMergesWith as(
select sea1, sea2
from mergesWith
union
select sea2, sea1
from mergesWith);

2. 영국부터 시작해서 해상으로 접근할 수 없는 모든 섬의 이름을 알고 싶다.

영국부터 시작해서 해상으로 접근할 수 있는 섬을 먼저 다 구해서 전체에서 빼주면 된다.

그러려면 영국에 직접적으로 인접한 바다 - 이 바다에 인접하고 있는 모든 섬 - 이 섬에 인접한 바다 - 인접하고 있는 섬 -... 식으로 계속 찾아나가야하므로 recursive를 사용한다. 

with recursive ~ as 형태로 표현하고, union 앞은 base case부분, union 뒤는 recursion부분을 작성한다.

 

여기서 base case는 영국으로 주어졌으므로 영국인 경우의 인접 바다를 base case에 넣어준다.

recursion부분은 recursive하면서 찾아낸 sea와 대칭화된 인접바다리스트(symMergesWith)의 sea2가 같으면 sea1를 반환하도록 짜준다.

with recursive islandsNotReachableBySea(sea) as(
select sea
from islandin
where island='Great Britain'
union ----------------------------이 앞은 base case, 뒤는 recursion
select sea1
from symMergesWith s, islandsNotReachableBySea inr
where s.sea2 = inr.sea)

select island
from islandin
except 
select island
from islandin i join islandsNotReachableBySea inr on i.sea = inr.sea;

그리고 최종 output을 도출하는 쿼리는 위에 찾아낸 애들을 다 제외해야한다.

찾아낸 애들은 전부 sea이므로 이를 islandin과 join해서 island리스트를 다 받아오고 이 내역을 빼준다.

 

Comments