아래의 문제는 HankerRank의 SQL문제 내용이며 코드는 직접 푼 내용입니다.
Symmetric Pairs
문제상황 및 주어진 테이블
요구사항
symmetric pairs는 x1 = y2 and x2=y1인 쌍을 의미한다.
x컬럼 기준으로 오름차순 정렬한 symmetric pairs 쌍을 구하라
결과물
풀이
x1 = y2 and x2=y1인 쌍이라는 말이 이해하기 어려웠다.
그러니까 x컬럼의 값이 y컬럼에도 있고,y컬럼의 값이 x컬럼에 있는 row를 찾는 것이다. 예를 들어 (20,2)이 출력된 이유는 1번쨰row와 2번쨰row를 통해 알 수 있다.(20,21)이 출력된 이유는 3번째row와 6번쨰 row를 통해 알 수 있다. (22,23)이 출력된 이유는 4번쨰row와 5번쨰 row를 통해 알 수 있다.
그러니까 x의 값이 y컬럼값들 중에 있고, y값이 x컬럼값들 중에 있는지를 확인해야한다.
또한, 출력결과를 보면 X와 Y가 같거나, X<Y인 형태이다.
그래서 이에 해당하는 조건도 추가해야한다.
마지막으로 X를 기준으로 오름차순으로 정렬해야한다.
여기에서 답을 보고 SELF JOIN 아이디어를 알게 되었다.
셀프조인이라고 별거 없다. 두개의 테이블을 조인하는데 내용만 같다고 보면 된다.
(X,Y)와 (Y,X)를 비교하기 위해서이다.
SELECT F1.X, F1.Y,F2.X,F2.Y FROM Functions F1
INNER JOIN Functions F2 ON F1.X=F2.Y AND F1.Y=F2.X
ORDER BY F1.X
저렇게 셀프조인에 INNER조인이면아래와 같은 결과를 볼 수 있다.
ON조건에 따라서 F1.X =F2.Y 그리고 F1.Y=F2.X로 묶어서
X,Y Y X 순으로 SELECT한 결과이다.
그리고 중복되는 값을 배제하기 위해 GROUP BY절을 추가하고
출력되는 결과가 X<Y이여야하니까 HAVING조건에 추가한다.
또 X=Y라고 생각했는데, 같다는 의미가 아니라 ROW 중복된 경우인걸 찾는거니까
COUNT(F1.X)>1인 조건을 추가해야한다.
결과
SELECT F1.X, F1.Y FROM Functions F1
RIGHT OUTER JOIN Functions F2 ON F1.X=F2.Y AND F1.Y=F2.X
GROUP BY F1.X, F1.Y
HAVING COUNT(f1.X)>1 or f1.X<f1.Y
ORDER BY F1.X
배운점
- SELF JOIN
응용
FUNCTION F1
1 | 1 |
2 | 24 |
4 | 22 |
7 | 19 |
FUNTCION2 F2
1 | 1 |
7 | 19 |
22 | 4 |
23 | 3 |
24 | 2 |
LEFT OUETR JOIN (SELF)
SELECT F1.X, F1.Y,F2.X,F2.Y FROM Functions F1
LEFT OUTER JOIN Functions F2 ON F1.X=F2.Y AND F1.Y=F2.X
ORDER BY F1.X
RIGHT OUTER JOIN(SELF)
SELECT F1.X, F1.Y,F2.X,F2.Y FROM Functions F1
RIGHT OUTER JOIN Functions F2 ON F1.X=F2.Y AND F1.Y=F2.X
ORDER BY F1.X
참고
참고한 블로그 링크
'코딩 테스트' 카테고리의 다른 글
[python] 문자열매칭. KMP 알고리즘 (백준16916, 백준1786) (0) | 2021.07.05 |
---|---|
[백준][python]1436.영화감독 숌 -완전탐색(브루트포스) (0) | 2021.06.10 |
[백준][python] 1157.단어공부 -문자열 (0) | 2021.06.10 |
[HankerRank] The PADS | CONCAT, SUBSTR (0) | 2021.05.31 |
[Python] 코딩테스트 고득점Kit | DFS/BFS1 - 타겟넘버 (0) | 2021.05.28 |
[LeetCode] 197. Rising Temperature | DATEDIFF (0) | 2021.05.27 |