CROSS JOIN
은 두 테이블에 존재하는 모든 records를 반환한다.
table1 and table2)
가능한 모든 조합을 반환하기 때문에
A CROSS JOIN B와 B CROSS JOIN A는 동일한 결과를 산출한다.
CROSS JOIN은 특별히 결합할 공통 키가 없거나, 모든 조합이 필요할 때 사용된다. 대부분의 경우 특정 조건에 따른 조인이 더 유용하며, 불필요한 데이터 조합을 피하기 위해 CROSS JOIN은 신중히 사용해야 한다. 데이터의 기하급수적인 증가를 예상해야 함.
with list as (
select *,count(subject_name) attended_exams
from Students join Examinations using(student_id)
group by 1,2,3)
select *
from list, subjects s
group by student_id, student_name ,list.subject_name, s.subject_name
-- having list.subject_name = s.subject_name
# 학생id, 이름, 과목 + count(e.student_id)를 통해 학생이 해당 수업을 몇 번 수강했는지 구한다.
SELECT s.student_id, s.student_name, sub.subject_name, COUNT(e.student_id) AS attended_exams
FROM Students s
# 가능한 모든 조합을 구하기 위한 CROSS JOIN
CROSS JOIN Subjects sub
# student_id, subject_name 이 동일한 아이들끼리 join하여 듣지 않는 과목에 null값을 만들어준다.(차후 0으로 변환)
LEFT JOIN Examinations e ON s.student_id = e.student_id AND sub.subject_name = e.subject_name
# group by 를 통해, 학생id,이름,과목 조합으로 묶어준다.
GROUP BY s.student_id, s.student_name, sub.subject_name
ORDER BY s.student_id, sub.subject_name;
cross join을 통해 가능한 모든 조합을 반환할 수 있다는 것을 배웠다.
나는 해당 조합을 만들기 위해 from 테이블1, 테이블2 를 사용했다.