cross join, full join강의 / leetcode 1280번 문제 질문드립니다
select a.student_id,
a.student_name,
a.subject_name,
count(e.subject_name) attended_exams
from
(
select student_id,
student_name,
subject_name
from Students, Subjects # cross join
) a
left outer join
(
select student_id,
subject_name
from Examinations
) e
on a.student_id=e.student_id
and a.subject_name=e.subject_name
group by a.student_id, a.student_name, a.subject_name
order by a.student_id, a.subject_name;해당 코드에 select 문에 있는
count(e.subject_name) attended_exams를 실행할 때,
count(a.subject_name) attended_exams와 같이 cross join을 실행한 subject_name을 기준으로 실행하는 경우에는 0값이 안나오는 결과를 확인했는데 둘의 차이가 궁금합니다.
Câu trả lời 1
1
승렬님 안녕하세요:)
늘 참신한 질문을 주셔서 감사합니다.
leetcode: https://leetcode.com/problems/students-and-examinations/description/
승렬님의 질문이
위의 코드 (e.subject_name -> 정답 코드)와 아래 코드(a.subject_name -> 오답 코드)의 차이가 무엇이냐로 이해했는데요.


이해를 위해 아래와 같이 데이터를 좀더 풀어봤습니다. (select *로 확인)

왼쪽 노란색 박스는 a temp table에서, 오른쪽 노란색 박스는 e temp table에서 온 결과입니다.
참고로 초록색 박스의 row가 왜 3개인지 말씀 드리면,
a temp table에서는 (1, Alice, Math) 조합이 1개이지만, e temp table에서는 (1, Math) 조합이 3개이므로 조인하는 과정에서 3개로 뻥튀기된 것입니다.
승렬님의 질문은 분홍색 박스를 확인하면 되는데요.
a temp table에서는 늘 subject_name이 들어있습니다. (분홍색 박스에서 Physics 존재)
반면 e temp table에서는 Examinations table에 없다면 조인할 데이터가 없으므로 null로 나타날 것입니다.
null 데이터는 count 자체가 성립이 안되기 때문에, count(null)=0이 됩니다. 그렇기 때문에 우리의 정답 코드처럼 count(e.subject_name)을 하면 0으로 나오는 것입니다.
반면 Physics는 count를 할 수 있기 때문에, count(Physics)=1이 됩니다. 그렇게 때문에 오답 코드 처럼 count(a.subject_name)을 하면 늘 1로 나오는 것입니다.
읽어보시고 이해 안가는 부분이 있으시면, 추가 질문 부탁드립니다:)
FOREIGN KEY 정리하기, 영상대로 SQL코드 복붙해도 안되요.
0
3
1
모델 서빙과 관련된 강좌 출시 예정된 바가 있으신지 여쭤봅니다!
0
6
1
Vercel 실행이 안됩니다
0
4
1
교안 158페이지 문의드립니다
0
9
2
코딩살구클럽 관련 건의사항
0
23
1
코살에 19942 다이어트 문제에 N의 범위가 빠져있슴니다
0
11
1
수강평 이벤트
0
21
2
패키지 구분에 대해 궁금한게 있습니다
0
12
1
진행 방법 질문드립니다!
0
42
2
노션 링크도 안 열리고, 알려준 vercel도 실행이 안됩니다.
0
15
1
문제 링크 변경
0
55
2
SQL 파일 다운로드
0
62
2
workbench 테이블 생성
0
274
2
sql 코딩 테스트에서 index 생성 가능 여부
1
282
2
not In강의 / leetcode 1978 질문 드립니다
2
198
1
LEETCODE - Sales Analysis 3 코드 질문드립니다.
1
279
1
[The Latest Login in 2020] datetime 계산 관련
1
249
1
[Average Selling Price] 문제 테스트케이스 실패
1
281
3
서브쿼리 질문
1
349
1
EASY INNER JOIN 관련 average-selling-price 연습문제
1
282
1
INNER JOIN 강의 질문
1
326
2
문제 주소 링크
1
297
2
work bench 설치관련 문의
1
280
2
깃헙 데스크탑, MYSQL 워크벤치 연동
2
859
3

