다른 사람의 답을 보는데 'JOIN'이 보이지 않는 코드가 있었다.
그 대신 From 절에 다음과 같이 여러개의 테이블이 선택되어있었다.
FROM USER_INFO A, ONLINE_SALE B, (SELECT COUNT(*) CNT
FROM USER_INFO
WHERE YEAR(JOINED) = 2021) C
테이블을 JOIN없이 그냥 나열할 경우 모든 컬럼이 조합되는 데카르트 곱이 발생한다.
그럼 JOIN은 어디에 있을까?
Where절에 있었다.
WHERE 1=1
AND A.USER_ID = B.USER_ID
.
.
+추가로 C는 서브쿼리의 결과이므로, 단일 행(single row) 결과를 갖게 됨 → 모든 행과 자연스럽게 결합됨
SELECT YEAR(B.SALES_DATE) YEAR, MONTH(B.SALES_DATE) MONTH, COUNT(DISTINCT(B.USER_ID)) PURCHASED_USERS, ROUND(COUNT(DISTINCT(B.USER_ID))/C.CNT, 1) PUCHASED_RATIO FROM USER_INFO A, ONLINE_SALE B, (SELECT COUNT(*) CNT FROM USER_INFO WHERE YEAR(JOINED) = 2021) C WHERE 1=1 AND A.USER_ID = B.USER_ID AND YEAR(A.JOINED) = 2021 GROUP BY YEAR(B.SALES_DATE) , MONTH(B.SALES_DATE) ORDER BY YEAR(B.SALES_DATE) , MONTH(B.SALES_DATE) ;
FROM 절: 결합에 필요한 테이블 두개, +새컬럼 생성시 계산에 필요한 전체 가입회원수를 구하는 서브쿼리를 넣음(단일 행이므로 문제발생 x)
WHERE 절 : JOIN해야하는 컬럼을 '='으로 연결 + 필요한 조건 삽입
의외로 조인을 사용하는 것보다 간단해 보인다!
나중에 스스로 써봐야지...