작성
·
196
2
안녕하세요. Union 해커랭크 풀이에서
Union을 반드시 써야하는 이유가 궁금합니다.
where 조건절에 X = Y 또는 X<Y 로 넣어서 하면
정답이 아니라고 나오는데 그 차이가 궁금합니다.
select
a.X,
a.Y
from
Functions a
inner join Functions b
on a.X = b.Y and b.X = a.Y
where a.X = a.Y or a.X < a.Y
order by a.X
답변 2
2
안녕하세요 inhye ghang님!
답변이 늦어져 죄송합니다.
아래 예시 데이터를 보시면서 생각해보시면 좋을 것 같아요.
예시 테이블 Functions에는 아래처럼 4개의 데이터가 들어있다고 해볼게요.
해당 문제에서는 아래 노란색으로 칠해진 케이스처럼 X와 Y의 데이터가 완벽하게 반대되는 경우가 있을 때 (8, 18) 데이터와 (18, 8) 은 한 쌍의 데이터라고 생각하여 정의를 하고 있는데요.
문제의 정답으로 출력을 할 때에는 이런 쌍들 중에서 X가 작은쪽의 (X, Y) 데이터 하나만 출력을 하라고 했습니다.
그러면 아래 Functions 테이블에서는 데이터에서는 결과적으로 (8, 18) 하나만 결과로 출력이 되어야합니다.
그럼 저런 한쌍이 있는지를 어떻게 알아낼거냐 했을 때, 우리는 Functions(A)라는 테이블에 Functions(B) 테이블을 직접 JOIN을 해주는 것으로 확인을 하려고 했습니다. A 테이블의 Y열 데이터와 B 테이블의 X열 데이터가 일치하면 JOIN하는 조건이었죠. 그럼 위에 있는 Functions 데이터를 가지고 JOIN을 한번 해보도록 하겠습니다.
그럼 위와 같은 상황이 벌어집니다. 첫줄과 두번째 줄까지는 데이터가 잘 들어갔습니다. 그런데 뜻하지 않게 네번째 줄에 있는 데이터까지 JOIN이 되어버렸어요. (12,12)가 들어있는 데이터는 하나 밖에 없었는데 말이죠. 이건 원본 테이블에서 보면 데이터가 하나밖에 없기 때문에 쌍이라고 할 수 없지만 X열에 있는 데이터와 Y열에 있는 데이터가 똑같기 때문에 JOIN을 할 경우 마치 우리가 원하는 한 쌍인 것 처럼 인식됩니다.
그래서 위와같이 X, Y 열에 들어있는 데이터가 완전히 같은 경우에는 JOIN을 이용해서 이 데이터가 Pair를 맞춘 데이터 인지 아닌지를 구분할 수 없기 때문에,
1. X열 데이터와 Y열 데이터가 같을 때 Pair를 구하는 쿼리를 짜고,
2. X 데이터와 Y 데이터가 서로 다를 때 Pair를 구하는 쿼리를 짜서
3. 나중에 최종적으로 합쳐주는 겁니다.
이 부분이 처음에 많이 헷갈려하시는 부분이어서 이해가 안되실 경우 예시 데이터들을 이용해서 문제를 조금만 더 천천히 뜯어보시는 것을 추천드립니다. 강의를 여러번 다시 들어보시는 것도 도움이 되실거에요 :)
추가질문이 있으시면 답글 남겨주세요.
고맙습니다.
1
"그럼 위와 같은 상황이 벌어집니다. 첫줄과 두번째 줄까지는 데이터가 잘 들어갔습니다. 그런데 뜻하지 않게 네번째 줄에 있는 데이터까지 JOIN이 되어버렸어요."
이부분에서 뜻하지 않게 생겨 버린 데이터를 처리하기 위에 조건에 Having 절을 추가하여 coun (*) > 1 로 말씀해주신 부분으로 생겨버린 의도하지 않은 데이터를 제거하고 진행하는 방법 설명 부탁드립니다~