https://www.hackerrank.com/challenges/placements/problem?isFullScreen=true
SELECT S.name
FROM Packages P
INNER JOIN Students S ON P.ID = S.ID
INNER JOIN Friends F ON S.ID = F.ID
INNER JOIN Friends FR ON F.ID = FR.Friend_ID
INNER JOIN Packages PA ON FR.ID = PA.ID
WHERE P.salary < PA.salary
ORDER BY PA.salary
: 다 풀어서 결과도 나왔으나 틀린 답이라고 뜬다.
SELECT S.name
FROM Friends F
INNER JOIN Students S ON F.ID = S.ID -- 아이디에 본인 이름 붙이기
INNER JOIN Packages P1 ON P1.ID = F.ID -- 본인 샐러리
INNER JOIN Packages P2 ON P2.ID = F.Friend_ID -- 친구 샐러리
WHERE P1.salary < P2.salary
ORDER BY P2.salary
문제를 보고, 먼저 풀이를 위해 테이블 형식으로 중요한 열을 쭉 테이블로 작성해보는 연습을 하자! 그렇게 하면 더 간단하게 풀 수 있는 방법을 더 쉽게 찾을 수 있다.
선생님은 이 방식대로 해서 INNER JOIN 세 번만 해서 정답을 도출했다.
동일한 테이블을 여러번 INNER JOIN할 수 있다. 다만 'AS 별칭'을 다르게 표현하면 된다.
https://www.hackerrank.com/challenges/binary-search-tree-1/problem?isFullScreen=true
나의 풀이
: CASE문을 쓰면 되겠다고 생각했지만, N과 P를 어떻게 구현해야 할지 모르겠어서 손을 못댔다.
선생님 풀이
SELECT DISTINCT BST.N
, CASE
WHEN BST.P IS NULL THEN 'Root'
WHEN BST2.N IS NULL THEN 'Leaf'
ELSE 'Inner'
END
FROM BST
LEFT JOIN BST AS BST2 ON BST.N = BST2.P
ORDER BY BST.N