오라클 외부조인(+)를 ANCI 표준으로 전환 0 14 8,314

by 아뵹 [SQL Query] Oracle SQL Outer Join ANCI [2020.03.16 23:25:26]


안녕하세요 계속 질문만 올리는 것 같네요 ㅠㅠ

좀 복잡하고 긴 오라클 쿼리를 postgresql로 바꾸는 작업을 하고 있는데요.

외부 조인 (+) 문을 ANCI 표준으로 바꾸고 싶습니다.

어떻게 바꾸는지는 검색해보니까 알겠는데 쿼리가 복잡하고 중복되는 테이블이 많다보니까 헷갈리네요 ㅠㅠㅠㅠ

쿼리문은 대충 이러합니다.

SELECT col1, col2, col3, col4

FROM Table1 D1
             , Table2 D2
             , Table3 D3
             , Table7 D7
             , Table8 D8
             , Table9 D9
             , Table10 D10
             , Table11 D11
             , Table13 D13
             , Table14 D14
WHERE D1.Table1_RES_RESULT_NO = D2.Table2_RES_RESULT_NO
             AND D1.Table1_UT = D3.Table3_UT(+)
             AND D2.Table2_RES_ID = D7.Table7_OBJ_NO 
             AND D2.Table2_RES_RESULT_DIV_CD = D9.Table9_RES_RESULT_DIV_CD (+)
             AND D9.Table9_RES_SUBJ_NO = D10.Table10_SUBJ_NO (+)
             AND Table13_CODE (+) = Table14_RESULT_EVAL_PART_CD
             AND Table13_CODE_DIV (+) = 'EEEE000' 
             AND D2.Table2_CNFM_YN = 'Y'
             AND (Table1_PUBL_YM BETWEEN '2019' || '11' AND '2019' || '12'  ) ;

 where 절 안에 있는 외부조인을 From으로 갖고 와야되는 건 맞죠.............?

Table1이 계속 중복되다보니까 ERROR:  table name "table1" specified more than once 이런 에러가 나네요....

쿼리 고수님 계신가요

by 마농 [2020.03.17 08:13:06]

올려주신 쿼리는 실제쿼리를 변형하여 올려주신 듯 한데
변형 과정에서 실제와 다르게 왜곡되지 않았을까? 의심이 갑니다.
테이블에 중복이 있다고 하셨지만? 중복되는 테이블은 안보이구요.
FROM 절의 테이블명과 알리아스명의 숫자가 일치하고 있고
WHERE 절의 컬럼명이 테이블명으로 시작하고 있는 듯 한데
예외적인 컬럼명이 하나 보이고요. D7.Table9_OBJ_NO <-- table7 의 컬럼명이 table9 으로 시작하는 것 맞나요?
Table13 과 Table14_로 시작하는 컬럼명 앞에 알리아스가 없는데? d13, d14 가 맞겠죠?
이 13번, 14번 테이블은 다른 테이블과의 관계가 전혀 없이 이 둘 끼리만 조인하네요?
8번 11번은 아예 조인이 되어 있지 않구요.
이렇게 실제와 다른 왜곡된 정보로 질문하시면 안됩니다.


by 아뵹 [2020.03.17 10:12:00]

쿼리가 너무 길어서 좀 줄이느라 오타가 있었습니다ㅠㅠ D7.Table9_OBJ_NO 는 D7.Table7_OBJ_NO 으로 글 수정 했습니다. 그 이후 말씀해주신 부분은 받은 쿼리랑 일치합니다......ㅎ...


by 마농 [2020.03.17 10:37:41]

그렇다면? 원래 쿼리가 이상한 것 같은데요?
13,14번은 지들끼리만 조인하고?
8, 11번은 아예 조인을 안하고?


by 아발란체 [2020.03.17 10:15:07]

LEFT JOIN 이용... ㅌㅌㅌ (무성의 답변 죄송합니다)


by 아뵹 [2020.03.17 10:30:20]

ㅎㅎㅎㅎ아니에요 where절 안에서 외부조인 하나만 있을 때는 LEFT, RIGHT JOIN 사용하는법은 알겠는데 저렇게 많을 때 특히 TAble1을 여러번 사용할 경우 어떻게 해야되는지 좀 헷갈리네요 ㅠㅠㅠㅠㅠ


by 마농 [2020.03.17 10:44:29]

쿼리가 이상하여 변경해 드리긴 좀 그렇고
쿼리 작성 기본유형 간단한거 보여드릴께요.
참고하세요.

-- Oracle --
SELECT *
  FROM t1 a
     , t2 b
     , t3 c
 WHERE a.c1 = b.c1     -- Inner Join     : (+) 가 없는 조인조건
   AND a.c2 = c.c2(+)  -- Outer Join     : (+) 가 있는 조인조건
   AND c.c3(+) = 3     -- On    절의 조건 : (+) 가 있는 상수조건
   AND a.c4 = 4        -- Where 절의 조건 : (+) 가 없는 상수조건
   AND b.c5 = 5        -- Where 절의 조건 : (+) 가 없는 상수조건
;
-- ANSI --
SELECT *
  FROM t1 a
 INNER JOIN t2 b
    ON a.c1 = b.c1
  LEFT OUTER JOIN t3 c
    ON a.c2 = c.c2
   AND c.c3 = 3
 WHERE a.c4 = 4
   AND b.c5 = 5
;

 


by 아뵹 [2020.03.17 11:54:00]

와 세상에 정말감사합니다.ㅠㅠㅠㅠ


by 아뵹 [2020.03.17 14:43:34]

저 혹시 질문 하나만 추가로 드려도될까요..?

밑에 쿼리와 같이 ,t4 d 와 AND c.c4 = d.c1(+) 부분이 추가되면 어떻게 될까요...?

--Oracle--


SELECT *
  FROM t1 a
     , t2 b
     , t3 c
     , t4 d
 WHERE a.c1 = b.c1     
   AND a.c2 = c.c2(+)
   AND c.c4 = d.c1(+)  
   AND c.c3(+) = 3     
   AND a.c4 = 4        
   AND b.c5 = 5        

by 마농 [2020.03.17 14:52:15]

테이블이 많아진다고 해서 사용법이 달라지는 것은 없습니다.
c 를 아우터 조인 했듯이
d 를 아우터 조인 하면 됩니다.
 

-- Oracle --
SELECT *
  FROM t1 a
     , t2 b
     , t3 c
     , t4 d            -- 추가
 WHERE a.c1 = b.c1     -- Inner Join     : (+) 가 없는 조인조건
   AND a.c2 = c.c2(+)  -- Outer Join     : (+) 가 있는 조인조건
   AND c.c3(+) = 3     -- On    절의 조건 : (+) 가 있는 상수조건
   AND c.c4 = d.c1(+)  -- 추가
   AND a.c4 = 4        -- Where 절의 조건 : (+) 가 없는 상수조건
   AND b.c5 = 5        -- Where 절의 조건 : (+) 가 없는 상수조건
;
-- ANSI --
SELECT *
  FROM t1 a
 INNER JOIN t2 b
    ON a.c1 = b.c1
  LEFT OUTER JOIN t3 c
    ON a.c2 = c.c2
   AND c.c3 = 3
  LEFT OUTER JOIN t4 d  -- 추가
    ON c.c4 = d.c1      -- 추가
 WHERE a.c4 = 4
   AND b.c5 = 5
;

 


by 아뵹 [2020.03.17 15:02:56]

헣 빠른 답변 감사드립니다 꾸벅~

복받으실거에요ㅎㅂㅎ


by 아뵹 [2020.03.17 22:06:18]

앞에서 알려주신 덕분에 해당 문제는 잘 해결하였습니다!

그런데....추가 질문이 생겼는데요........ㅎㅎ....

--Oracle--

SELECT col1, col2, col3   -- col3 : 추가된 테이블 t5로부터 계산되는 열
  FROM t1 a
     , t2 b
     , t3 c
     , t4 d
     , t5 e          -- 추가 테이블
 WHERE a.c1 = b.c1     
   AND a.c2 = c.c2(+)
   AND c.c4 = d.c1(+)  
   AND c.c3(+) = 3     
   AND a.c4 = 4        
   AND b.c5 = 5

-- ANSI --

SELECT col1, col2, col3
  FROM t5 e            -- 추가
, t1 a
 INNER JOIN t2 b
    ON a.c1 = b.c1
  LEFT OUTER JOIN t3 c
    ON a.c2 = c.c2
   AND c.c3 = 3
  LEFT OUTER JOIN t4 d  
    ON c.c4 = d.c1      
 WHERE a.c4 = 4
   AND b.c5 = 5

위의 sql을 아래와 같이 수정하니까 쿼리가 끝없이 도네요... 제가 한시간까지 기다려봤는데요....

진짜 아닌거같아서 질문 다시 드립니다 허허...

위와 같은 상황에서는 어떻게 수정해야할까요 마농님ㅠㅠ


by 마농 [2020.03.17 23:53:09]

지속적으로 몇번씩 동일한 답변 달았던 부분입니다.
조인조건이 없네요?
이거 맞는 쿼리인지???


by 아뵹 [2020.03.17 23:58:06]

아 잘못된 쿼리인가요!!??? 세상에......잘못된 건지도 몰라서 답변을 이해못했었네요 엌ㅋㅋㅋㅋㅋㅋㅋ

그러면 다른 테이블과 조인은 굳이 필요없는 상황에서 t5 내부의 열인 col3을 사용해야할 때는 t5를 어떤식으로 추가 정의해줘야 하나요...?


by 마농 [2020.03.18 07:51:07]

관계가 있으니 함께 보려는 거겟죠?
관계가 없는걸 왜 함께 보나요?

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