
문제 살펴보기
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.
요약하자면
맞는 짝 찾기
조건
SELECT *
FROM Functions f1 INNER JOIN Functions f2
ON f1.X = f2.Y AND f1.Y = f2.X
ORDER BY f1.x
X1 = Y2 and X2 = Y1 에 따라
f1.X = f2.Y AND f1.Y = f2.X으로SLEF JOIN해줌
WRONG ANSWER
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 f1.x < f1.y or f1.x = f1.y
ORDER BY f1.x
HAVING 절에서 X1 ≤ Y1 조건을 충족시켜주고 싶었지만 식이 틀림
중복값을 찾아주는 쿼리문을 작성해야함
X1 ≤ Y1 에서 이 X = Y 가 같은 값을 전부 찾아줘! 라는 소리가 아니었다.
단순히 X, Y 두 값이 각각 같은 쌍이 아니라 특정 X Y가 있다 했을 때 X Y 값이 서로 바뀌었을 때도 같은 값이 있는 페어를 찾아달란 소리였다. 즉 (3,4) (4,3) 이런 식의 값을 말이다.


문제 속 실례를 살펴봤을 때 이 2 24 24 2 같은 페어를 말이다.
최종정답
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
중복값을 찾는 쿼리식을 써주면서 정답!
외전
JOIN없이 그냥 풀어봤을 때
SELECT f1.X, f1.Y
FROM Functions f1
GROUP BY f1.X, f1.Y
HAVING COUNT(f1.x) > 1 or f1.X < f1.Y
ORDER BY f1.x

보면 7 19 는 페어가 없어서JOIN없이 그냥 풀면
COUNT(f1.x) > 1 or f1.X < f1.Y 조건은 맞지만 페어가 없었기 때문에(페어가 없어서 JOIN 도 안된 상태) 틀림