Prepare > SQL > Advanced Join > Symmetric Pairs

2023. 6. 6. 16:55HackerRank-My SQL

 

Symmetric Pairs | HackerRank

Write a query to output all symmetric pairs in ascending order by the value of X.

www.hackerrank.com

 

 

문제


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.

 

=> 대칭쌍들을 X기준으로 쿼리하라. X < Y .

 

 

 

 

 

코드


SELECT F1.X, F1.Y

FROM FUNCTIONS AS F1
    INNER JOIN FUNCTIONS AS F2 ON F1.Y = F2.X AND F1.X = F2.Y

GROUP BY F1.X, F1.Y
HAVING COUNT(*) > 1 OR F1.X < F1.Y
ORDER BY 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 (F1.X <> F1.Y OR COUNT(*) <> 1) AND F1.X <= F1.Y
ORDER BY F1.X;

HAVING절 설명

  • F1.X와 F1.Y가 다른 경우: 그냥 조회하면 잘 뜸
  • F1.X와 F1.Y가 같은 경우: INNER JOIN의 결과로 X,Y의 조합 개수가 제곱으로 불어남 1:N 관계의 조인
  • (1 -> 1), (2 -> 4), (3 -> 9) ... 그러므로 COUNT(*) != 1 조건을 달아줌

 

 

 

 

노트


SELECT F1.X, F1.Y
FROM FUNCTIONS AS F1
    INNER JOIN FUNCTIONS AS F2 ON F1.Y = F2.X
    
WHERE F1.X = F2.Y AND F1.X <= F1.Y
    
ORDER BY F1.X
;

 

 

X1, Y1, X2, Y2 중에 Y1 = X1으로 JOIN해서 테이블 만듦

SELECT *
FROM FUNCTIONS AS F1
    INNER JOIN FUNCTIONS AS F2 ON F1.Y = F2.X

ORDER BY F1.X
;

 

 

나머지 조건 적용

SELECT F1.X, F1.Y
FROM FUNCTIONS AS F1
    INNER JOIN FUNCTIONS AS F2 ON F1.Y = F2.X
    
WHERE F1.X = F2.Y AND F1.X <= F1.Y
    
ORDER BY F1.X
;
  • 오답임. 왜 안되는지 구글링 해봄
  • 18,18 같은 게 한 쌍만 있으면 pair가 아님, 18,18 이 두 쌍 있어야 대칭쌍으로 인정

 

 

SELECT *

FROM FUNCTIONS AS F1
    LEFT JOIN FUNCTIONS AS F2 ON F1.Y = F2.X AND F1.X = F2.Y

ORDER BY F1.X
;
  • JOIN 조건 ON에는 AND로 복수의 조건을 넣을 수 있다.