EXISTS 질문 0 8 928

by DB_SQL [Oracle 기초] EXSISTS [2020.10.30 10:16:16]



안녕하세요? 몇개월 전에 한 분이 올린 글을 보고 풀리지 않는 의문이 있어서 글을 올립니다. 

첨부된 파일이 문제입니다.

group by 절이 없다면 전체에 대해 계산한다고 한 것은 이해가 잘 됐습니다. 

그렇다면, 서브쿼리1 (상관) 에서 1명의 회원에게 발송된 이메일 건수에 대해 having count(*)를 적용하는 것인가요??

예를들어, 회원ID='1' 이 2014년10.01과 같거나 큰 이벤트에 모두 참석했다면, Having count(*) < (SELECT COUNT(*) FROM 이벤트 WHERE 시작일자>='2014.10.01') 이 거짓이 된다고 볼 수 있는 것인가요??

아니면 Having count(*)는 어떻게 적용이 된다고 볼 수 있는것일까요???

by 마농 [2020.10.30 10:44:55]

문제 쿼리의 구조가 2단계 중첩 서브쿼리 형태로 구성되어 있네요.
메인(서브1(서브2))) 형태
서브1은 메인과의 연관조건(a.회원ID = c.회원ID)이 있으므로 상관 서브쿼리입니다. 메인의 회원 1명당 1번씩 개별 수행됩니다.
서브2는 서브1과의 연관조건이 없으니 비상관 서브쿼리로, 독립적으로 수행 가능합니다.
서브1에서는 회원당 COUNT(*) 를 구하고 있고. (매 행마다(회원마다) 달라지는 값)
서브2에서는 전체 COUNT(*) 를 구하고 있습니다. (고정값)
이 두 카운트를 서로 비교하네요. (③번 보기의 설명)


by DB_SQL [2020.10.30 11:07:07]

감사합니다.

만약, 이벤트 테이블에서 2014.10.01이후에 시작하는 이벤트가 총 3건이 있고, 회원 ID=1을 가진 회원이 그 이벤트 모두 참여했고, 회원 ID=2를 가진 회원은 그 중 2개만 참석했다면, 

1) 회원1이 참석한 이벤트 개수 (문자 발송된 건수) = 3  < 3 (False)

2) 회원2가 참석한 이벤트 개수 (문자 발송된 건수) = 2 < 3 (True)

가 되어, 회원2가 출력되는 것인가요??


by 마농 [2020.10.30 11:17:21]

Exactly!


by DB_SQL [2020.10.30 11:25:00]

빠른답변 정말 감사드립니다. 이전에 다른 분이 위 문제로 동일한 질문을 한 것에 대해 마농님께서 답변을 다셨던 것 중에 ,

"위 쿼리는 3단계 서브쿼리 형태네요.(메인, 서브1(상관), 서브2(비상관))
서브1은 상관서브쿼리로 메인의 회원ID 별로 동작합니다.
서브1은 회원ID별로(상관) 수행되어 이벤트일자 조건을 만족하는 발송메일 건수를 구하네요.
서브2는 독립적으로(비상관) 수행되어 이벤트일자 조건을 만족하는 이벤트 건수를 구하구요.
서브2에서 구한 건수를 서브1에서 조건으로 사용하네요.
서브1의 결과 존재여부를 메인에서 체크합니다.
(회원별 2014.10.01 이후 이벤트 메일 발송 건수)가 (2014.10.01 이후 전체이벤트 건수)보다 작은 경우
즉, 2014.10.01 이후 이벤트에 대한 메일발송이 누락된 회원 구하기"

위에서 볼드처리 한 부분이 헷갈려서 확인하고자 여쭤봅니다. 

만약 그렇다면, 회원 1이 출력되는 것인지 아니면 여전히 회원2가 출력되는 것인지 궁금합니다..!!

 

 


by 마농 [2020.10.30 13:03:38]

서브쿼리의 조건이 참이어야 서브쿼리 결과가 나오겠지요.
서브쿼리 결과가 나와야 EXISTS 조건이 참이 되고
EXISTS 조건이 참이되어야 해당 회원이 출력됩니다.


by DB_SQL [2020.10.30 13:43:14]

답변해주셔서 다시한번 감사드립니다..

정말, 정말 죄송하지만... 한번만 더 여쭤보겠습니다ㅜㅜ...

친절하게 잘 설명해주셔서 쿼리 작동방식은 이제 이해가 됐습니다.

 

하지만, 쿼리가 담고 있는 그 의미가 아직 이해가 안된 것 같습니다..

"2014.10.01 이후 이벤트에 대한 메일발송이 누락된 회원 구하기" 라고 말씀해주셨는데, 만약 이벤트 테이블에는 14/10/01 이후 시작된 이벤트가 3개인데, 회원 ID 2인 사람은 그 중 2개만 참석했다면... 이 사람은 서브쿼리 1 문을 만족해서 출력이 될 것으로 생각합니다. 그런데, 그렇다 하더라도 회원 ID 2인 사람이 참석한 이벤트 2건에 대해서는 메일 발송이 된 것이라 생각되는데, 제가 어디서 잘못 생각하는 걸까요..?? 


by 마농 [2020.10.30 13:46:34]

2014.10.01 이후 이벤트 3건에 대한 메일발송이 1건이라도 누락된 회원 구하기
2번 회원은 3건의 메일을 받았어야 하는데 2건밖에 받지 못하였으므로
해당 조건을 만족하여 출력됨


by DB_SQL [2020.10.30 17:22:23]

아, 이제 이해가 되네요.. 감사합니다^^!!!

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입