exists 관련질문입니다. 0 5 5,206

by 생각하쟈 [Oracle 기초] exists [2015.10.21 15:34:03]


그림1.png (689,551Bytes)

안녕하세요 지금 exists 의 관련해서 공부하고 있는데;;

이해가 안되는 부분이 있어 어떻게 이해를 해야될지 몰라 질문드립니다.

exists 란 서브 쿼리의 값이 본쿼리에 있으면 출력하고 

not exists 란 없는 값을 출력하는 것으로 알고 있습니다.

여기까지는 제가 이해를 했습니다. 

이와 같은 테이블이 있다고 가정햇을때

select sname from sailors where exists 

(select * from reserves where sailors.sid=reserves.sid);

를 하면 22, 31,64,74 가 존재하는 sailors의 열을 출력하는거 라고 생각을 했습니다.

문제는 다음입니다 

모든 보트를 예약한 사람을 찾으라는 문제였습니다.

이 테이블에선 모든 배를 예약한 dustin 을 찾는 것이 목표입니다.

여기서 답이 밑에 부분인데 전혀 이해를 못하겠습니다

 

SELECT S.sname

FROM Sailors S

WHERE NOT EXISTS (SELECT B.bid

  FROM Boats B

  WHERE NOT EXISTS (SELECT R.bid

  FROM Reserves R

  WHERE R.bid=B.bid   AND R.sid=S.sid))

위와 같이 하면 신기하게 답이 나옵니다.

그러나 제가 생각하기엔 이는 보트를 하나도 예약하지 않은 사람이 아닌 사람을 찾는 것이 아닌가요....???

읽어주셔서 감사합니다...

 

by jkson [2015.10.21 15:50:51]
SELECT b.bid
  FROM boats b
 WHERE NOT EXISTS (SELECT r.bid
                     FROM reserves r
                    WHERE r.bid = b.bid
                      AND r.SID = s.SID)
->보트테이블 기준으로 SID로 예약된 건이 없는 보트

SELECT s.sname
  FROM sailors s
 WHERE NOT EXISTS (SELECT b.bid
                     FROM boats b
                    WHERE NOT EXISTS (SELECT r.bid 
                                        FROM reserves r
                                       WHERE r.bid = b.bid
                                         AND r.SID = s.SID
                                     )
                  )
->세일러테이블 기준으로 (보트테이블 기준으로 SID로 예약된 건이 없는 보트) 가 없음(not exists 이므로)
->세일러테이블 기준으로 모든 보트를 예약한 사람

 


by 생각하쟈 [2015.10.21 16:25:35]

아 뭔가 뭔가..? 조금 알것 같기도 하면서 아 진짜 어렵네요;;;

예약건이 없는 보트 가 아닌? 이 뜻이  모든 보트를 예약한  아 어려워 ....

아 아무튼 감사합니다 아 어려워 


by jkson [2015.10.21 15:56:38]

exists 란 서브 쿼리의 값이 본쿼리에 있으면 출력하고 

not exists 란 없는 값을 출력하는 것으로 알고 있습니다.

-> 이 부분을 어떻게 이해하신 건지 모르겠네요..

exists 절 이하에 데이터가 1건이라도 나오면 true가 되고 없으면 false 이므로

exists 절 이하에 데이터가 있냐 없냐에 따라 결과 값을 가지고 올지 말지가 결정되는 것이지

본쿼리랑 무조건 조인해서 exists 문을 쓰지는 않습니다.


by 마농 [2015.10.21 16:01:16]

가장 안쪽의 NOT EXISTS 서브쿼리에
조건으로 s.sid 와 b.bid 가 조건으로 주어졌네요.
sid 와 bid 의 조합으로 예약된 건이 없는 bid 를 우선 찾고
바같쪽 에서 다시 NOT EXISTS 로 걸르니
예약이 없는 bid 가 없는 sid 을 찾는거죠.
이중 부정이 되는 것이죠. 이중 부정은 강한 긍정을 의미하죠.


by 생각하쟈 [2015.10.21 16:26:26]

댓글 감사합니다.. 근데 솔직히 아직도 헷갈리네요;;헷갈려.. 감사합니다

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