안녕하세요? 몇개월 전에 한 분이 올린 글을 보고 풀리지 않는 의문이 있어서 글을 올립니다.
첨부된 파일이 문제입니다.
group by 절이 없다면 전체에 대해 계산한다고 한 것은 이해가 잘 됐습니다.
그렇다면, 서브쿼리1 (상관) 에서 1명의 회원에게 발송된 이메일 건수에 대해 having count(*)를 적용하는 것인가요??
예를들어, 회원ID='1' 이 2014년10.01과 같거나 큰 이벤트에 모두 참석했다면, Having count(*) < (SELECT COUNT(*) FROM 이벤트 WHERE 시작일자>='2014.10.01') 이 거짓이 된다고 볼 수 있는 것인가요??
아니면 Having count(*)는 어떻게 적용이 된다고 볼 수 있는것일까요???
빠른답변 정말 감사드립니다. 이전에 다른 분이 위 문제로 동일한 질문을 한 것에 대해 마농님께서 답변을 다셨던 것 중에 ,
"위 쿼리는 3단계 서브쿼리 형태네요.(메인, 서브1(상관), 서브2(비상관))
서브1은 상관서브쿼리로 메인의 회원ID 별로 동작합니다.
서브1은 회원ID별로(상관) 수행되어 이벤트일자 조건을 만족하는 발송메일 건수를 구하네요.
서브2는 독립적으로(비상관) 수행되어 이벤트일자 조건을 만족하는 이벤트 건수를 구하구요.
서브2에서 구한 건수를 서브1에서 조건으로 사용하네요.
서브1의 결과 존재여부를 메인에서 체크합니다.
(회원별 2014.10.01 이후 이벤트 메일 발송 건수)가 (2014.10.01 이후 전체이벤트 건수)보다 작은 경우
즉, 2014.10.01 이후 이벤트에 대한 메일발송이 누락된 회원 구하기"
위에서 볼드처리 한 부분이 헷갈려서 확인하고자 여쭤봅니다.
만약 그렇다면, 회원 1이 출력되는 것인지 아니면 여전히 회원2가 출력되는 것인지 궁금합니다..!!
답변해주셔서 다시한번 감사드립니다..
정말, 정말 죄송하지만... 한번만 더 여쭤보겠습니다ㅜㅜ...
친절하게 잘 설명해주셔서 쿼리 작동방식은 이제 이해가 됐습니다.
하지만, 쿼리가 담고 있는 그 의미가 아직 이해가 안된 것 같습니다..
"2014.10.01 이후 이벤트에 대한 메일발송이 누락된 회원 구하기" 라고 말씀해주셨는데, 만약 이벤트 테이블에는 14/10/01 이후 시작된 이벤트가 3개인데, 회원 ID 2인 사람은 그 중 2개만 참석했다면... 이 사람은 서브쿼리 1 문을 만족해서 출력이 될 것으로 생각합니다. 그런데, 그렇다 하더라도 회원 ID 2인 사람이 참석한 이벤트 2건에 대해서는 메일 발송이 된 것이라 생각되는데, 제가 어디서 잘못 생각하는 걸까요..??