Symmetric Pairs (INNER JOIN, GROUP BY, HAVING, ORDER BY, UNION)
[문제]
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
[나의 풀이]
SELECT F1.X, F1.Y
FROM functions AS F1
INNER JOIN functions AS 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
출력결과
X | Y |
2 | 24 |
4 | 22 |
5 | 21 |
6 | 20 |
8 | 18 |
9 | 17 |
11 | 15 |
13 | 13 |
[설명]
1. INNER JOIN
> F1.X = F2.Y 그리고 F2.X = F1.Y인 값 찾기
SELECT F1.X, F1.Y
FROM functions AS F1
INNER JOIN functions AS F2 ON F1.X = F2.Y AND F1.Y = F2.X
X | Y |
1 | 1 |
2 | 2 |
2 | 24 |
24 | 2 |
4 | 4 |
: : |
: : |
참고) INNER JOIN 내용
2023.05.20 - [SQL/중급] - INNER JOIN, SELF JOIN
2. F1.X F1.Y로 그룹화
SELECT F1.X, F1.Y
FROM functions AS F1
INNER JOIN functions AS 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
> GROUP BY절 이용하여 그룹화하고 출력하면 중복값이 제거되어 나온다.
( 맨 위에 있는 값만 출력되기 때문)
> 둘 중 하나는 만족해야 하므로 OR를 작성한다.
참고) GROUP BY 내용
2023.05.19 - [SQL/초급] - 그룹화 하기 (GROUP BY, COUNT(*))
1) F1.X = F1.Y
> 다음과 같이 같은 값을 같는 행이 2개 이상있어야 하므로
COUNT(F1.X) > 1을 작성한다.
X | Y |
2 | 2 |
2 | 2 |
2) F1.X < F1.Y
> 다음 값 중 F1.X < F1.Y인 값은 (X, Y) = (1, 2)일 때다.
X | Y |
1 | 2 |
2 | 1 |
3. F1.X를 오름차순으로 정렬하기
SELECT F1.X, F1.Y
FROM functions AS F1
INNER JOIN functions AS 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
[다른 사람 풀이]
SELECT X, Y
FROM functions
WHERE X = Y
GROUP BY X, Y
HAVING COUNT(*)=2
UNION
SELECT f1.x, f1.y
FROM functions AS f1
INNER JOIN functions AS f2 ON f1.X = f2.Y AND f1.Y = f2.X
WHERE f1.X < f1.Y
ORDER BY X
> UNION을 이용하여 작성하였다.
[설명]
1. X = Y일 때 같은 행이 2개인 값 출력
2. X < Y일 때 값 출력
3. 두 개의 갑을 UNION으로 합치기 (중복 제거됨)
4. UNION을 쓸 때에는 ORDER BY 가장 맨 뒤에 작성하기