https://www.hackerrank.com/challenges/placements/problem?isFullScreen=true
코드설명
INNER JOIN 을 활용합니다.
처음에 작성한 오답코드입니다.
SELECT S.NAME
FROM STUDENTS S
INNER JOIN PACKAGES P
ON S.ID = P.ID
WHERE P.SALARY < ( SELECT FP.SALARY AS FRIENDSALARY
FROM PACKAGES FP
WHERE FP.ID = (SELECT F.FRIEND_ID
FROM FRIENDS F
WHERE F.ID = S.ID) );
무엇이 틀렸을까요? 로직 자체는 맞습니다.
1. STUDENT의 친구를 구합니다.
SELECT F.FRIEND_ID
FROM FRIENDS F
WHERE F.ID = S.ID)
2. 각 친구의 SALARY를 구합니다.
( SELECT FP.SALARY AS FRIENDSALARY
FROM PACKAGES FP
WHERE FP.ID = (SELECT F.FRIEND_ID
FROM FRIENDS F
WHERE F.ID = S.ID) )
3.STUDENT와 친구의 SALARY를 비교해서 친구의 SALARY가 나보다 크다면 출력합니다.
SELECT S.NAME
FROM STUDENTS S
INNER JOIN PACKAGES P
ON S.ID = P.ID
WHERE P.SALARY < ( SELECT FP.SALARY AS FRIENDSALARY
FROM PACKAGES FP
WHERE FP.ID = (SELECT F.FRIEND_ID
FROM FRIENDS F
WHERE F.ID = S.ID) );
4. 여기서 문제점이 발생합니다
우리가 작성한 서브쿼리의 값을 외부에서 정렬할 수 없습니다. 이유는 서브쿼리의 값이 단일결과를 반환하기에 당연히 안되기도하고, 서브쿼리 값이 여기서는 1회성으로 쓰이고 종료되기 떄문입니다.
해결방안은 무엇일까요?
바로 직접 테이블에 넣어야 합니다.
JOIN을 활용해서 STUDENT와 PACAKAGE.
FRIEND와 PACAKAGE 각각의 데이터를 한개의 테이블로 JOIN 시키면 훨씬 간단하게 해결할 수 있습니다.
ORACLE 코드
SELECT S.NAME
FROM STUDENTS S
INNER JOIN FRIENDS F
ON S.ID = F.ID
INNER JOIN PACKAGES P
ON S.ID = P.ID
INNER JOIN PACKAGES FP
ON F.FRIEND_ID = FP.ID
WHERE P.SALARY < FP.SALARY
ORDER BY FP.SALARY ASC;