오라클 SQLPLUS 추출해내는 코드.
안녕하세요. 저번에 트리거관련 질문을 올렸었던 사람입니다.
요즘 원서를 보면서 공부하고있는데, 연습문제중에 다음과 같은 문제가 있는데 코드를 짜고나서 추출하면 답이 답지와 다르게 나오는데
제 코드가 어디서 잘못됐는지 못찾겠어서 여기계신분들께 여쭙고자 글을 올리게 되었습니다.
문제는 다음과 같습니다.
the program will ask for two dates, in “YYYY- MM-DD”format. After you input the two dates(from 1998- 02-01 to 1998- 05-01), the program displays the client IDs and company names of those which didn’t make any order between the given two dates.
1998-02-01 ~ 1998-05-01 기간동안 주문을 안한 clientid와 회사이름을 추출해 내는것이라서 다음과 같이 코드를 짜봤는데, 아무리 생각해봐도 어디서 잘못됐는지를 찾지 못하겠습니다.(답답하네요ㅜㅜ) _ 테이블이나 이런 데이터들은 일단 다 만들어 놓고 시작하는것이라 책과 차이는 없을것같은데 답지가 잘못된것인지..
제가 짜본 코드는 다음과 같습니다.
select clientid as "Client ID" ,companyname as "Company Name" from clients where clientid in ((select clientid from orders) minus (select clientid from orders where orderdate between to_date('1998-02-01','yyyy-mm-dd') and to_date('1998-05-01','yyyy-mm-dd')))
뭔가 잘못되었다면 지적해주시면 감사하겠습니다 .
감사합니다!!
기간에 상관없이 한 건도 주문하지 않은 회사는 나오지
기간에 상관없이 한 건도 주문하지 않은 회사는 나오지 않겠네요.
아 일단 지적 감사합니다!!
아래 chanik님께서 알려주셨네요. 감사합니다.
위에 익명님이 지적하신대로입니다. 아래와 같이 하시면
위에 익명님이 지적하신대로입니다. 아래와 같이 하시면 될 것 같네요.
항상 감사합니다.
저번에도 그렇고 이번에도 감사합니다.
여기서 제가 쓴건.
~~~ in select ~~ minus select ~~ between ~~~.인데
chanik님께서 알려주신것과 어디서 차이가 나는건지 알 수 있을까요?
저는 이게 똑같은거라 생각해왔었습니다..
아무튼 너무 감사합니다.!!
우선, 작성하신 query는 아래와 같이 정리하여
우선, 작성하신 query는 아래와 같이 정리하여 내부의 select문을 하나 제거해도 동일한 결과가 나올 것입니다.
아래과 같이 가정해보겠습니다.
- 전체 고객의 수 : 100명 (clients 테이블에 등록된 고객 수)
- 한 번이라도 주문한 적이 있는 고객의 수 : 80명 (orders 테이블에 등장하는 고객 수)
- 위의 기간동안 주문한 적이 있는 고객의 수 : 60명
문제가 요구한 것은 "위 기간동안 주문한 적이 없는 고객의 목록"이므로 정답은 100명 - 60명 = 40명의 목록이 될 것입니다.
하지만 작성하신 쿼리는 orders 테이블, 즉 한 번이라도 주문한 적이 있는 고객만을 대상으로 clientid를 골라내고 있으므로 80명 - 60명 = 20명의 명단만을 출력하게 됩니다. 즉, 한 번도 주문한 적이 없는 고객 20명 때문에 차이가 나는 셈이고, 이것이 바로 위의 익명님이 지적하신 점입니다.
만약 모든 고객들이 한 번씩이라도 주문을 한 적이 있다면 clients 테이블과 orders 테이블 모두에 100명의 고객들이 다 등장할테니, 작성하신 쿼리로도 정답이 나올 것입니다.
위 문제는 join을 통해서도 풀 수 있겠는데, 이
위 문제는 join을 통해서도 풀 수 있겠는데, 이 경우에도 비슷한 비교를 해 볼 수 있습니다.
아래와 같이 inner join으로 작성하면 20명의 목록만을 보여주게 될 것입니다.
하지만 아래와 같이 left outer join을 하게 되면 clients 테이블의 레코드 가운데 orders 테이블에 등장하지 않는 것들도 빠뜨리지 않게 되므로 40명의 목록을 다 보여주게 됩니다.
위 문법은 ANSI SQL 문법이고, 각각 아래와 같이 오라클 전용 문법으로 표시할 수도 있습니다.
오라클을 쓸 수 있는 상황이 아니어서 확인하지 못했으므로, sql문에 오류가 있을지 모릅니다.
참고 : http://www.orafaq.com/wiki/Outer_join
정말감사합니다..
평소에 잘 모르고 그냥 쓰고 있었는데,, 정말 감사합니다!!
댓글 달기