본문 바로가기

프로그래머스 풀이/Lv 4

[프로그래머스 SQL] 서울에 위치한 식당 목록 출력하기(ORACLE)

728x90

https://school.programmers.co.kr/learn/courses/30/lessons/131118?language=oracle

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

JOIN, GROUP BY 등을 사용해야하는 SELCT 문제이다.

각 테이블에서 원하는 정보들을 뽑아 조인하면 되는 문제.

 

방법 1. 각 테이블에서 원하는 정보 추출 후 JOIN

1. REST_INFO 테이블에서 서울인 정보들만 추출

2. REST_REVIEW 테이블에서 SCORE의 평균 추출

3. 두 테이블 조인

 

SELECT 
    RI.REST_ID, 
    RI.REST_NAME, 
    RI.FOOD_TYPE, 
    RI.FAVORITES, 
    RI.ADDRESS, 
    ROUND(RR.SCORE, 2) AS SCORE 
FROM 
    (
        SELECT * 
        FROM REST_INFO 
        WHERE ADDRESS LIKE '서울%'
    ) RI
JOIN 
    (
        SELECT REST_ID, AVG(REVIEW_SCORE) AS SCORE 
        FROM REST_REVIEW 
        GROUP BY REST_ID
    ) RR 
ON RI.REST_ID = RR.REST_ID
ORDER BY SCORE DESC, RI.FAVORITES DESC;

 

먼저 조인 후 원하는 값 추출

1. REST_ID 가 같은 것으로 JOIN

2. 특정값들로 그루핑 

3. 서울에 있는 것을 추출

 

SELECT 	RR.REST_ID,REST_NAME,
		FOOD_TYPE,	FAVORITES,	
        ADDRESS, 
        ROUND(AVG(REVIEW_SCORE), 2) AS SCORE 
FROM REST_INFO RI 
JOIN REST_REVIEW RR 
ON RI.REST_ID = RR.REST_ID
GROUP BY RR.REST_ID,REST_NAME,
		 FOOD_TYPE,	
         FAVORITES,	
         ADDRESS
HAVING ADDRESS LIKE '서울%'
ORDER BY SCORE DESC, FAVORITES DESC;

 

위 코드에서 MySQL과 ORACLE 의 GROUP BY 전략에 대한 차이가 들어난다. 위 코드에선 그룹바이에서 REST_ID 뿐 아니라 SELECT 절에 들어가야하는 모든 값을 그루핑했다. 하지만 MySQL에서는 REST_ID만해도 오류가 안나지만 ORACLE은 오류가 난다. 이것은 따로 포스팅해야할 것 같다.