/////
Search
Duplicate

Symmetric Pairs

태그
SELF_JOIN
한 번 더 체크

문제

You are given a table, Functions, containing two columns: and Y.
Two pairs (X1, Y1) and (X2, Y2) are said to be symmetric pairs if X1 = Y2 and X2 = Y1.
Write a query to output all such symmetric pairs in ascending order by the value of X. List the rows such that X1 ≤ Y1.

예시

Sample Input
Sample Output
20 20 20 21 22 23
Plain Text
복사

정답

SELECT F1.X, F1.Y FROM Functions F1 INNER 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;
SQL
복사

풀이

JOIN의 조건을 여러 개 설정하는 방법을 묻는 문제이다.
문제에서 제시된 조건은 1) X1 = Y2 & 2) Y1 = X2 이다. 따라서 Functions 테이블을 SELF JOIN 한 다음에 1) 과 2) 조건을 명시해주면 된다.
FROM Functions F1 INNER JOIN Functions F2 ON F1.X=F2.Y AND F1.Y=F2.X
SQL
복사
다만 주의해야 하는 점은 X1 = Y1일 때이다. X1=Y1이라면 무조건 F1.X=F2.Y AND F1.Y=F2.X 조건을 만족한다.
그런데 X1=Y1인 점이 Symmetric을 만족하기 위해서는 동일한 점이 한 개 더 필요하다. 동일한 점이 하나 더 있는지 확인하기 위해서는 F1.X과 F1.Y를 기준으로 그룹핑 해서 한 개 보다 많은 경우 동일한 점이 있는 것이다. 따라서 GROUP BY 와 HAVING 절을 이용한다.
GROUP BY F1.X, F1.Y HAVING COUNT(F1.X)>1
SQL
복사
이와 더불어 X ≤ Y인 점만 조회하라고 하였기 때문에 X < Y 조건을 추가해준다. 이때 주의할 점은 X ≤ Y로 하면 X1 = Y1인데 Symmetric이 아닌 점이 포함될 수 있기 때문에 X < Y로 해준다.
GROUP BY F1.X, F1.Y HAVING COUNT(F1.X)>1 or F1.X<F1.Y
SQL
복사
나머지는 출력 조건에 맞춰서 풀면 된다.