/////
Search
Duplicate

헤비 유저가 소유한 장소

태그
서브쿼리
한 번 더 체크
목차

문제

PLACES 테이블은 공간 임대 서비스에 등록된 공간의 정보를 담은 테이블입니다. PLACES 테이블의 구조는 다음과 같으며 IDNAMEHOST_ID는 각각 공간의 아이디, 이름, 공간을 소유한 유저의 아이디를 나타냅니다. ID는 기본키입니다.
이 서비스에서는 공간을 둘 이상 등록한 사람을 "헤비 유저"라고 부릅니다. 헤비 유저가 등록한 공간의 정보를 아이디 순으로 조회하는 SQL문을 작성해주세요.

예시

예를 들어, PLACES 테이블이 다음과 같다면
760849번 유저는 공간을 3개 등록했으므로 이 유저는 헤비유저입니다.
30900122번 유저는 공간을 2개 등록했으므로 이 유저는 헤비유저입니다.
21058208번 유저는 공간을 1개 등록했으므로 이 유저는 헤비유저가 아닙니다.
따라서 SQL 문을 실행하면 다음과 같이 나와야 합니다.

정답

SELECT * FROM PLACES WHERE HOST_ID IN (SELECT HOST_ID FROM PLACES GROUP BY HOST_ID HAVING COUNT(ID)>=2) ORDER BY ID;
SQL
복사

풀이

WHERE 절에서 서브쿼리의 사용 방법을 묻는 문제이다.
만약
SELECT * FROM PLACES GROUP BY HOST_ID HAVING COUNT(HOST_ID) >= 2;
SQL
복사
로 풀면 HOST_ID 당 하나의 데이터만 추출되기 때문에 틀린 답이 된다.
따라서 WHERE 절의 서브쿼리를 이용하여 HOST_ID가 두 개 이상인 HOST_ID 들에 대한 데이터만 조회할 수 있도록 풀어야 한다.
WHERE HOST_ID IN (SELECT HOST_ID FROM PLACES GROUP BY HOST_ID HAVING COUNT(ID)>=2)
SQL
복사
EXISTS를 이용하여 푸는 방법도 있다. (IN은 () 안의 값을 전부 확인하는 반면 EXISTS는 해당되면 바로 출력하기 때문에 더 효율적이라고 한다.)
SELECT * FROM PLACES PL1 WHERE EXISTS ( SELECT 1 FROM PLACES PL2 WHERE PL1.HOST_ID = PL2.HOST_ID GROUP BY HOST_ID HAVING COUNT(*) > 1 ) ORDER BY ID;
SQL
복사
→ 이때 SELECT 1은 따로 출력할 필요가 없기 때문에 임의로 자리를 채울 때 사용하는 방법이다.