Advanced Join 문제다!
문제 이해하는데 시간이 좀 걸렸다.
Symmetric Pairs는 어떤 함수 F에 대해 F(X1) = Y1, F(X2) = Y2 일 때, X1 = Y2이고 X2 = Y1인 두 항을 말한다.
즉 위의 함수에서는 (첫 번째, 두번째), (세 번째, 여섯 번째), (네 번째, 다섯 번째)의 세 쌍의 Symmetric Pairs가 나온다.
이때, 한 쌍 안에서 X <= Y 인 하나의 행만 출력하면 된다.
FUNCTIONS을 Self Join하여 X와 Y가 교차하여 같은 행을 찾는다.
이렇게 하면 위 이미지의 첫 번째 행 같이 X=Y인 행이 모두 골라지는데, 이러한 행이 두 개 있어야 하나의 쌍이 만들어지는 것이므로 하나의 행만 존재하는 경우는 제거해야 한다. (HAVING절 첫 번째 조건)
나머지 행들은 모두 X ≠ Y인 경우이므로, 이 중 X < Y인 것만 남기면 된다. (HAVING절 두 번째 조건)
SELECT F1.X, F1.Y
FROM FUNCTIONS F1, FUNCTIONS F2
WHERE 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
;
'Algorithm' 카테고리의 다른 글
[해커랭크 HackerRank] SQL Project Planning (Oracle) (0) | 2021.04.03 |
---|---|
[해커랭크 HackerRank] Placements (Oracle) (0) | 2021.03.19 |