LEFT JOIN 시 ORA-01799 열은 하위 질의에 포괄 조인될 수 없습니다. 1 4 6,158

by 동동동 [SQL Query] [2021.03.04 09:22:41]


안녕하세요..

SELECT * 
   FROM MAIN_TBL A
LEFT JOIN CD_TBL B
   ON B.COD = A.COD
LEFT JOIN SUB_TBL C
   ON C.NUM = A.NUM
 AND C.DVSN = DECODE((SELECT COUNT(*) FROM SUB_TBL
                       WHERE NUM = A.NUM
                         AND DVSN = A.DVSN
                         AND ROWNUM = 1), 0, 'C', A.DVSN)
;
위의 쿼리에서 AND C.DVSN = DECODE...절 때문에 ORA-01799 열은 하위 질의에 포괄 조인될 수 없습니다. 에러가 나는데요..

 

다른 방법 없을까요?

 

by 마농 [2021.03.04 10:23:31]

sub_tbl 의 PK 가 뭔가요? (num, dvsn) 인가요?
dvsn 이 같은 자료가 없으면? dvsn 이 'C' 인 자료를 가져오려는 의도인가요?
SELECT * 로 적혀 있어서 컬럼명은 임의로 적어 봤습니다.
 

SELECT a.*
     , b.*
     , NVL(c.num , d.num ) c_num 
     , NVL(c.dvsn, d.dvsn) c_dvsn
     , NVL(c.col1, d.col1) c_col1
     , NVL(c.col2, d.col2) c_col2
  FROM main_tbl a
  LEFT JOIN cd_tbl b
    ON b.cod  = a.cod
  LEFT JOIN sub_tbl c
    ON c.num  = a.num
   AND c.dvsn = a.dvsn
  LEFT JOIN sub_tbl d
    ON d.num  = a.num
   AND d.dvsn = 'C'
;

 


by 동동동 [2021.03.04 11:31:05]

마농님 답변 감사드립니다.

1. sub_tbl 의 PK 는 (num, dvsn) 입니다.

2. dvsn 이 같은 자료가 없으면 dvsn 이 'C' 인 자료를 가져오려는게 맞습니다.

 

알려주신 방법데로 아웃터 조인을 따로 걸어야 하는군요...

 

답변 감사드립니다..


by 마농 [2021.03.04 13:32:09]
SELECT a.*
     , b.*
     , d.*
  FROM main_tbl a
  LEFT JOIN cd_tbl b
    ON b.cod  = a.cod
  LEFT JOIN sub_tbl c
    ON c.num  = a.num
   AND c.dvsn = a.dvsn
  LEFT JOIN sub_tbl d
    ON d.num  = a.num
   AND d.dvsn = NVL(c.dsvn, 'C')
;

 


by 동동동 [2021.03.04 16:11:24]

헐...신기하네요....

답변 감사드립니다..ㅠㅠ

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