문제
You are given a table, Functions, containing two columns: X 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
복사
•
나머지는 출력 조건에 맞춰서 풀면 된다.