database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Q&A 35004 게시물 읽기
No. 35004
full outer join 결과가 left outer join 결과와 같이 나옵니다. INLINE VIEW를 FROM 절에 사용하면 문제가 되나요?
작성자
pengjin(pengjin)
작성일
2008-12-22 14:55
조회수
4,166


 1.
  SELECT A.DURATION, A.DT, B.DURATION_PRE, B.DT
  FROM
      (  
       SELECT TO_CHAR(TO_DATE('20081117','yyyymmdd') + ROWNUM - 1,'yyyymmdd') DURATION,
          TO_CHAR(TO_DATE('20081117','yyyymmdd') + ROWNUM - 1,'dd') DT
       FROM EVENT
       WHERE ROWNUM <= TO_DATE('20081216','yyyymmdd')- TO_DATE('20081117','yyyymmdd') + 1
      )A FULL OUTER JOIN
      (  
       SELECT TO_CHAR(TO_DATE('20081017','yyyymmdd') + ROWNUM - 1,'yyyymmdd') DURATION_PRE,
          TO_CHAR(TO_DATE('20081017','yyyymmdd') + ROWNUM - 1,'dd') DT
       FROM EVENT
       WHERE ROWNUM <= TO_DATE('20081116','yyyymmdd')- TO_DATE('20081017','yyyymmdd') + 1
      )B 
  ON A.DT = B.DT

  위 쿼리를 실행하면 FULL OUTER JOIN 이 제대로 실행되지 않고 LEFT OUTER JOIN 한 결과가 나옵니다.
  FROM 절에 A, B 와 같이 INLINE VIEW 를 사용하면 FULL OUTER JOIN 이 안되는 건지 궁금합니다.
  
  위 쿼리에서 A, B를 각각 THIS_MONTH, PRE_MONTH 인 VIEW 로 만든후 FULL OUTER JOIN 하면
  결과가 제대로 나옵니다. 

 2.
  SELECT *
  FROM THIS_MONTH A FULL OUTER JOIN PRE_MONTH B
  ON A.DT = B.DT

  원하는 결과테이블은 아래와 같이 20081031일 데이타가 나와야 합니다.

  A.DURATION   A.DT    B.DURATION,   B.DT
  ------------------------------------------------------
  20081117     17     20081017   17
  20081118     18     20081018   18
    .             .
    .             .
  20081130     30     20081030   30
                           20081031   31 <-- 31 일 데이타가 나와야 합니다.
  20081201     01     20081101   01
    .             .
    .             .
  20081216     16     20081116   16

  1번 FULL OUTER JOIN 쿼리를 실행하면 결과가 아래의 LEFT OUTER JOIN 한 결과와 같이 나옵니다.
    
  A.DURATION   A.DT    B.DURATION,   B.DT
  ------------------------------------------------------
  20081117     17     20081017   17
  20081118     18     20081018   18
    .             .
    .             .
  20081130     30     20081030   30
  20081201     01     20081101   01
    .             .
    .             .
  200812116     16     20081116   16


FULL OUTER JOIN 으로 31일 날짜를 뽑으려고 하는데
머가 문제인지 LEFT OUTER JOIN 한 결과데이타가 나옵니다.

문제가 먼지 알려주시면 감사하겠습니다.
아니면 다른 더 좋은 방법이 있으면 알려주시면 더욱 감사하겠습니다.
몇일동안 여기저기 찾아보고 있는데 알 수가 없습니다.
부탁드립니다.

그럼 날씨가 많이 추운데 건강하십시오~


  

이 글에 대한 댓글이 총 2건 있습니다.

답은 아니지만..

ANSI SQL 로 FULL OUTER 를 사용 할 경우 11 이하 버젼에서는 원하는 PLAN 이 안나옵니다. PLAN 확인해 보시고.. ANSI SQL 을 다른 방법으로 풀어서 사용하시는게 좋을듯 합니다.

HUNS님이 2008-12-22 19:51에 작성한 댓글입니다. Edit

HUNS님 감사합니다.

HUNS 말씀대로 실행계획을 보니 아래와 같습니다.              

Operation Object Name Rows Bytes Cost Object Node In/Out PStart PStop

SELECT STATEMENT Optimizer Mode=ALL_ROWS  2     70                          

  VIEW  2   92   70                          

    UNION-ALL                                

      HASH JOIN OUTER  1   66   54                          

        VIEW  1   39   46                          

          HASH GROUP BY  1   41   46                          

            HASH JOIN OUTER  211   8 K 45                          

              TABLE ACCESS FULL DMM.DURATION 30   540   3                          

              TABLE ACCESS BY INDEX ROWID DMM.IDS_EVENT_DAILY 211   4 K 41                          

                INDEX RANGE SCAN DMM.NUQ_IDSEVENTDAILY_ATTACKCOUNT 117     3                          

        VIEW  31   837   8                          

          HASH JOIN OUTER  31   775   8                          

            TABLE ACCESS FULL DMM.DURATION 31   186   3                          

            VIEW  1   19   4                          

              HASH GROUP BY  1   23   4                          

                TABLE ACCESS BY INDEX ROWID DMM.IDS_EVENT_DAILY 1   23   4                          

                  INDEX RANGE SCAN DMM.NUQ_IDSEVENTDAILY_DURATION 1     3                          

      HASH GROUP BY  1   41   16                          

        FILTER                              

          HASH JOIN  1   41   8                          

            TABLE ACCESS BY INDEX ROWID DMM.IDS_EVENT_DAILY 1   23   4                          

              INDEX RANGE SCAN DMM.NUQ_IDSEVENTDAILY_ATTACKCOUNT 1     3                          

            TABLE ACCESS FULL DMM.DURATION 31   558   3                          

          HASH GROUP BY  1   37   8                          

            HASH JOIN  7   259   7                          

              TABLE ACCESS FULL DMM.DURATION 1   18   3                          

              INDEX RANGE SCAN DMM.NUQ_IDSEVENTDAILY_ATTACKCOUNT 211   3 K 3                          

실행계획에 보면 FILTER 라고 되어있는데... HASH JOIN OUTER 가 되어야 하는건가요?

위 실행계획 대로라면 제대로된 FULL OUTER JOIN 결과가 나올수 없나요?

그럼 쿼리를 어떻게 수정해야 되는지 궁금합니다.


실행계획 좀 봐주세요~


pengjin(pengjin)님이 2008-12-22 20:48에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
35010백업&복구의 자동화를 위한 RMAN 책 추천좀 해주세요!!
윤철민
2008-12-23
2357
35006140명을 10개조로 랜덤 하게 조편성 할수있는 방법이.. [2]
염정훈
2008-12-22
3286
35005초보 쿼리좀 도와주세요... [2]
초보자
2008-12-22
2955
35004full outer join 결과가 left outer join 결과와 같이 나옵니다. INLINE VIEW를 FROM 절에 사용하면 문제가 되나요? [2]
pengjin
2008-12-22
4166
35003새로운 그룹 번호 매기기 ㅜㅜ;; [1]
김명현
2008-12-22
2679
3500210G 서버 데이타를 9i 로 import 가능한가여? [1]
김현주
2008-12-20
2747
35001hot 백업에서 datafile을 불완전 복구하는데 잘 안되네요 ㅋ [4]
윤철민
2008-12-19
5757
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.019초, 이곳 서비스는
	PostgreSQL v16.4로 자료를 관리합니다