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 이런 에러가 나네요....
쿼리 고수님 계신가요
올려주신 쿼리는 실제쿼리를 변형하여 올려주신 듯 한데
변형 과정에서 실제와 다르게 왜곡되지 않았을까? 의심이 갑니다.
테이블에 중복이 있다고 하셨지만? 중복되는 테이블은 안보이구요.
FROM 절의 테이블명과 알리아스명의 숫자가 일치하고 있고
WHERE 절의 컬럼명이 테이블명으로 시작하고 있는 듯 한데
예외적인 컬럼명이 하나 보이고요. D7.Table9_OBJ_NO <-- table7 의 컬럼명이 table9 으로 시작하는 것 맞나요?
Table13 과 Table14_로 시작하는 컬럼명 앞에 알리아스가 없는데? d13, d14 가 맞겠죠?
이 13번, 14번 테이블은 다른 테이블과의 관계가 전혀 없이 이 둘 끼리만 조인하네요?
8번 11번은 아예 조인이 되어 있지 않구요.
이렇게 실제와 다른 왜곡된 정보로 질문하시면 안됩니다.
쿼리가 이상하여 변경해 드리긴 좀 그렇고
쿼리 작성 기본유형 간단한거 보여드릴께요.
참고하세요.
-- 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 ;
테이블이 많아진다고 해서 사용법이 달라지는 것은 없습니다.
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 ;
앞에서 알려주신 덕분에 해당 문제는 잘 해결하였습니다!
그런데....추가 질문이 생겼는데요........ㅎㅎ....
--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을 아래와 같이 수정하니까 쿼리가 끝없이 도네요... 제가 한시간까지 기다려봤는데요....
진짜 아닌거같아서 질문 다시 드립니다 허허...
위와 같은 상황에서는 어떻게 수정해야할까요 마농님ㅠㅠ