조인에 문제 같은데 잘 모르겠습니다... 0 5 2,439

by 조남규 [SQL Query] 아우터 이너 조인 중복 [2013.10.14 09:32:38]


일단 제가 작성한 쿼리부터 보여드리겠습니다.

    SELECT A.CUST_NM
, A.CUST_CARD_NO
, B.STORE_CD AS STORE_CD
, DECODE(#gv_sCountryCd#, 'KR', C.K_STORE_NM, C.G_STORE_NM) AS STORE_NM
, B.SALE_DATE
, B.PROC_FG
, B.SALE_AMT
, B.DC_AMT
, B.ACC_POINT
, B.USE_POINT
, B.CUST_NO 
      FROM CH_CUST A
, CT_CUST_POINT B
, MM_STORE C
     WHERE SALE_DATE BETWEEN #FROM_DATE# AND #TO_DATE#    
  AND A.CUST_NO = B.CUST_NO
  AND B.STORE_CD(+) = C.STORE_CD
  AND A.CORP_CD = C.CORP_CD

고객의 포인트를 보여주는 화면입니다.

먼저 중복되는 것이 A에는 전체 CUST_NO의 정보가 있고 B에는 고객의 포인트를 쌓아두는 곳이라

중복으로 CUST_NO가 들어갈 수 있습니다.

그리고 C는 전체의 STORE_CD 데이터가 있고 B에는 조건에 맞는 데이터가 들어갑니다. 그 중에 NULL값도 포함됩니다.

C.CORP_CD도 마찬가지로 전체 법인데이터고 A에는 해당되는것만 나오도록 되어있구요.

설명이 좀 이상한가 싶기도 한데.. 결국엔 조회 했을때 B가 주가 되고 A에서는 CUST_NM과 CUST_CARD_NO를 가져오구요

근데 저렇게 조회를 하면 B의 STORE_CD에는 널값도 있는데 그것은 가져오지 못하네요...

조인이 잘못됐다고 밖에 생각못하겠는데 어딘지 모르겠습니다.
by 마농 [2013.10.14 09:41:58]
B 를 기준으로 가져온다면 C 를 아우터 조인 하셔야죠.
그런데 c 에 조인 걸리는게 a 와 b 두개 테이블이네요.
이렇게 두개 테이블을 기준으로 c 에 아우터 조인을 걸수는 없습니다.(11g 에서는 될 수도 있음)
해결방법은 다음 두가지 방식을 고려해 보세요
1. a 와 b 를 우선 조인한후 인라인뷰로 묶고 c와 아우터 조인
2. ANSI SQL 조인 방식 사용

by 조남규 [2013.10.14 09:46:09]
제가 말씀드린 기준으로 가져온다는것이

대부분의 데이터가 B에 있고 C는 전체의 STORE_CD, CORP_CD를 갖고 있는 것이고

A도 고객의 이름 카드번호만 갖고 있는것이거든요.. 11g는 맞는것 같은데

나머지 말씀은 어떤 말인지 모르겠네요

제가 설명을 잘못드린것 같기도 하고...

by 조남규 [2013.10.14 10:03:55]
해결된 것 같습니다. (+)를 전체쪽(c)쪽에 붙이고 corp_cd문을 삭제하니 원하는 값이 나오네요

감사합니다.

by 마농 [2013.10.14 10:37:30]
B 를 기준으로 조회하면서 A 의 고객명과 C 의 매장명을 가져오는 것이죠.
그런데 B 의 매장코드에 널값이 있어서 C 와 조인할때 실패해서 안나오는거죠.
C 와의 조인에서 실패하더라도 B 는 나와야 하는것이 아우터 조인이죠.
그래서 c 에 (+) 를 붙여줘야 하는데 조인이 a, b 두개인 경우에는 에러가 납니다.
 WHERE b.store_cd = c.store_cd(+)
   AND a.corp_cd  = c.corp_cd (+)
corp_cd 조건은 없어도 되는 조건인가 보군요?
혹시 모든 테이블에 다 있는 컬럼이라면 a.corp_cd 대신 b.corp_cd 로 조인하시면 되겠네요.

by 조남규 [2013.10.17 10:33:21]
네 말씀하신대로입니다 

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