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 40737 게시물 읽기
No. 40737
아우터 조인 관련 질문
작성자
궁금
작성일
2015-03-16 09:43
조회수
7,254

 with t as (
                                    select 'A' D1 , 10 D3 from dual
                                    UNION ALL
                                    select 'B' D1 , 20 D3 from dual
                                    UNION ALL
                                    select 'C' D1 , 30 D3 from dual
                                    )
                                    select BASE.D1, BASE.D2, T.D3
                                    from t ,
                                         (SELECT 'A' D1 ,'AA' D2 FROM DUAL
                                          UNION ALL
                                          SELECT 'B' D1 ,'AA' D2 FROM DUAL
                                          UNION ALL
                                          SELECT 'C' D1 ,'BB' D2 FROM DUAL
                                          UNION ALL
                                          SELECT 'D' D1 ,'CC' D2 FROM DUAL
                                          UNION ALL
                                          SELECT 'E' D1 ,'CC' D2 FROM DUAL ) BASE
                                  WHERE T.D1 (+)= BASE.D1

위 형식의 데이터가있었습니다.

그런데 입력 되는 데이터인 T테이블에, D2컬럼 갑자기 추가되었습니다

1년째 D2없이 D1만으로 테이블이 관리되고있었었기때문에,

현재 D2에는 1년동안의 데이터는 NULL이고 최근 입력된데이터만 D2값이있습니다

BASE테이블은 마스터로 관리되고있는데..

D2는 중복 값이있기때문에, D1, D2와 함께 WHERE 조건문에걸어야합니다

그러나 아우터조인과 OR조건 혹은 NVL이 함께 써지지가않더군요..

WHERE T.D1 (+)= BASE.D1  조건만 하면 D2의 중복되는 값떄문에안되고
AND T.D2 (+)= BASE.D2 조건은 D2의 NULL이 아닐때만 해당해야하는데..

어떻게해야될까요...?

 with t as (
                                    select 'A' D1 ,'' D2, 10 D3 from dual
                                    UNION ALL
                                    select 'B' D1 ,'' D2, 20 D3 from dual
                                    UNION ALL
                                    select 'D' D1 ,'CC' D2, 30 D3 from dual
                                    UNION ALL
                                    select 'D' D1 ,'DD' D2, 40 D3 from dual
                                    )
                                    select BASE.D1, BASE.D2, T.D3
                                    from t ,
                                         (SELECT 'A' D1 ,'AA' D2 FROM DUAL
                                          UNION ALL
                                          SELECT 'B' D1 ,'AA' D2 FROM DUAL
                                          UNION ALL
                                          SELECT 'C' D1 ,'BB' D2 FROM DUAL
                                          UNION ALL
                                          SELECT 'D' D1 ,'CC' D2 FROM DUAL
                                          UNION ALL
                                          SELECT 'E' D1 ,'CC' D2 FROM DUAL ) BASE
                                  WHERE T.D1 (+)= BASE.D1
                                    AND T.D2 (+)= BASE.D2

 

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

-- ANSI JOIN 구문을 사용하시면 OR조건에 대한 제약을 피할 수 있습니다.
SELECT b.d1, b.d2, a.d3
  FROM base b
  LEFT OUTER JOIN t a
    ON a.d1 = b.d1
   AND NVL(a.d2, b.d2) = b.d2
 ORDER BY d1, d2
;

마농(manon94)님이 2015-03-16 16:29에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
40745마농님 지정시간 관련 sql 문의드립니다. [2]
김태경
2015-03-17
7290
40744그룹해서 최대 데이터 4개 출력 [2]
윤민근
2015-03-17
6345
40738[쿼리질문] 세로열을 가로열로 만들기 [4]
최혁준
2015-03-17
7976
40737아우터 조인 관련 질문 [1]
궁금
2015-03-16
7254
40736조건 정시기준 분할 데이터 문의 드립니다. [3]
김태경
2015-03-16
7508
40735while문 이용해서 로그인 쿼리 [1]
권기범
2015-03-12
6631
40734VB에서 오라클 WITH 문 사용시 오류 [2]
이창선
2015-03-12
7597
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.018초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다