Join 관련 질문 0 3 1,234

by 왕보초 [Oracle 기초] join sql [2017.11.10 02:08:02]


안녕하세요.. 

궁금한점이 있어서 문의드려요...

---------------------------------------------------------------------------------------------

테이블은 A, B, B1 테이블 있구요...

A 테이블이 주 테이블이구요...

B는  B로시작는 SMB_ID 필드에는 5자리 데이터가 있구요...(예 : B1001, B0020)

B1는 C로시작는 SMB_ID 필드에는 5자리 데이터가 있구요...(예 : C2001, C0010)

A의 SMB_ID 필드에는 모두 B, B1의 SMB_ID 값이 모두 있습니다.(예 : B1001, C0010, D0020)

--------------------------------------------------------------------------------------------- 

A 테이블의 SMB_ID  값이 있지만 B 또는 B1에는 A 테이블의 SMB_ID 없을 수도 있습니다.

이런경우 A 테이블에도 있고 B, B1에 데이터가 있는 경우에만 데이터를 추출하고 싶은데

어떤 조인을 걸어야 할까요???

예를 들어  A 테이블 SMB_ID 값이 B에는 없지만 B1의 SMB_ID 해당하는 값이 있다면 B1의

데이터는 나와겠죠...(B 테이블은 0건, B1 테이블에는 1건 그래서 전체 ROWS 1건의 데이터) 

UNION ALL 이나 OUTER JOIN 후 처리는 하는 방법도 있기는 한데 그 방법 말고는 없느지

궁금해서 문의 드립니다.

참고로 각 테이블 건수는 각각 백만건 이상입니다.

---------------------------------------------------------------------------------------------

A테이블

SMB_ID SUB_CODE  ETC_INFO SMB_DATE
C2001 05 가나다라 20171101
B9001 07 가나다라 20171103
D0020 45 가나다라 20171001

B테이블

SMB_ID SMB_INFO SMB_DATE
B7001 가나다라 20171001
B8001 가나다라 20171001

B1테이블

SMB_ID SMB_CHECK_CODE SMB_DATE
C2001 A001 20171101
C9999 A101 20171101

-------------------------------------------------------------------------------------------

 

 

 

 

 

 

by 우리집아찌 [2017.11.10 11:58:22]
WITH A ( SMB_ID	, SUB_CODE , ETC_INFO  , SMB_DATE )AS (
SELECT 'C2001' , '05' ,'가나다라' ,'20171101' FROM DUAL UNION ALL
SELECT 'B9001' , '07' ,'가나다라' ,'20171103' FROM DUAL UNION ALL
SELECT 'D0020' , '45' ,'가나다라' ,'20171001' FROM DUAL 
), B ( SMB_ID , SMB_INFO , SMB_DATE ) AS (
SELECT 'B7001' , '가나다라' ,'20171001'  FROM DUAL UNION ALL
SELECT 'B8001' , '가나다라' ,'20171001'  FROM DUAL
), B1 (SMB_ID , SMB_CHECK_CODE , SMB_DATE) AS (
SELECT 'C2001' , 'A001' ,'20171101'  FROM DUAL UNION ALL
SELECT 'C9999' , 'A101' ,'20171101'  FROM DUAL
)

SELECT A.* , B.SMB_ID 
  FROM A
    , ( SELECT SMB_ID FROM B 
        UNION ALL
        SELECT SMB_ID FROM B1 ) B
 WHERE A.SMB_ID = B.SMB_ID    
   

 


by 그로밋 [2017.11.10 14:24:25]
SELECT A.*
  FROM A
  WHERE EXISTS (SELECT 1 FROM B
                  WHERE B.SMB_ID = A.SMB_ID)
     OR EXISTS (SELECT 1 FROM B1
                  WHERE B1.SMB_ID = A.SMB_ID); 

 


by 왕보초 [2017.11.12 03:07:03]

여러고수님의 답변 감사드립니다.

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