본문 바로가기

데이터 분석/SQL

[MY SQL] Symmetric Pairs / 조건분기+union

>> 문제

=> (x,y)의 좌표들이 행으로 주어짐

=> (x.y) 를 뒤집은 (y.x)가 행에 존재하면 그 행을 출력하라는 문제

 

>>입력 예시

>> (20, 20) 은 (20, 20)과 대응

>> (20, 21) 은 (21, 20)과 대응

>> (22, 23) 은 (23, 22)와 대응

=> 여기서 20, 20이 서로 같아도 행이 두 개여야 인정됨

=> 즉, x,y가 같은 x,x가 한 행만 존재한다면 출력하면 안된다.

 


>> 내가 푼 풀이

 

먼저 경우를 2가지로 구분하였다. 

 

case1 )  x==y 일 때

=> 만약 같은 행이 하나 더 존재하면 출력해야 함

 

ex)

(20,20) 이 하나만 있다면 -> 대응되는 행이 없으므로 출력x

(20,20) 이 하나 이상 있다면 -> 대응되는 행이 있으므로 출력o

 

case2 )  x <> y 일 때

=> (y,x)가 존재하면 출력해야 함

 

ex) (20,21) => (21,20)이 존재하면 출력

 

 

=> 제출 코드

 

=> 이 논리를 압축시킨 다른 사람의 코드

SELECT f1.X, f1.Y
FROM Functions f1
JOIN Functions f2
  ON                 f1.Y=f2.X AND f1.X=f2.Y
WHERE           f1.X <= f1.Y                           => (x,y) / (y,x)가 존재
GROUP BY      f1.X, f1.Y                               => x,y로 그룹화
HAVING          COUNT(*)>1 OR f1.X<>f1.Y  => x,y가 다르거나 / 같은 행이 두개 이상 존재하면 출력
ORDER BY f1.X, f1.Y