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
1. 중복(역순) 제거를 위해 X₁ ≤ Y₁ 인 쌍만 보여줄 것
2. 결과를 X 값 기준으로 오름차순 정렬할 것
-- 1) 대칭 쌍의 “첫 번째 값”(X₁)과 “두 번째 값”(Y₁)”을 선택
SELECT
f1.X AS X,
f1.Y AS Y
-- 2) Self-Join: 테이블을 f1, f2로 두 번 읽어 “모든 대칭 조합”을 찾는다
FROM Functions AS f1
INNER JOIN Functions AS f2
ON f1.X = f2.Y -- (X₁ = Y₂)
AND f1.Y = f2.X -- (Y₁ = X₂)
-- ┌───────────────────────────────────────────────────────────────────────────┐
-- │ 조인 결과 예시 A:
-- │ 원본에 (20,21),(21,20),(20,20),(20,20)이 있을 때
-- │ (20,21)<->(21,20) → 2건
-- │ (20,20)x2건↔x2건 → 4건
-- └───────────────────────────────────────────────────────────────────────────┘
-- ┌───────────────────────────────────────────────────────────────────────────┐
-- │ 조인 결과 예시 B (단일행):
-- │ 원본에 (20,21),(21,20),(20,20) 단 한 건만 있을 때
-- │ (20,21)<->(21,20) → 2건
-- │ (20,20)↔자기 자신 → 1건
-- └───────────────────────────────────────────────────────────────────────────┘
-- 3) 같은 (X,Y) 값끼리 묶어 “몇 번 매칭됐는지” 집계 준비
GROUP BY
f1.X,
f1.Y
-- 4) 그룹 단위 필터링:
-- • 자기-대칭 (X=Y) 은 원본에 2건 이상 있을 때만 → JOIN 후 COUNT(*)>1
-- • 서로 다른 대칭 (a,b)/(b,a) 은 a<b 인 쪽만 → f1.X < f1.Y
HAVING
COUNT(*) > 1 -- (X=Y) 그룹이 JOIN 후 2건 이상 매칭된 경우만 통과
OR f1.X < f1.Y -- (X≠Y) 그룹 중 작은 값이 X인 쪽만 통과
-- ┌───────────────────────────────────────────────────────────────────────────┐
-- │ HAVING 동작 예시 A:
-- │ • (20,20) 그룹: JOIN 결과 4건 → COUNT(*)=4>1 ⇒ 통과
-- │ • (20,21) 그룹: JOIN 결과 1건, 20<21 ⇒ 통과
-- │ • (21,20) 그룹: JOIN 결과 1건, 21<20 거짓 ⇒ 제외
-- │ • (22,23)/(23,22) 유사 방식
-- └───────────────────────────────────────────────────────────────────────────┘
-- ┌───────────────────────────────────────────────────────────────────────────┐
-- │ HAVING 동작 예시 B (단일행):
-- │ • (20,20) 그룹: JOIN 결과 1건 → COUNT(*)=1>1 거짓 ⇒ 제외
-- │ • (20,21) 그룹: COUNT=1, 20<21 ⇒ 통과
-- │ • (21,20) 그룹: COUNT=1, 21<20 거짓 ⇒ 제외
-- └───────────────────────────────────────────────────────────────────────────┘
-- 5) X 값 기준 오름차순 정렬
ORDER BY
f1.X ASC
;