2013-11-14 1 views
2

문제는Oracle SQL - 외부 조인 테이블에서 어떻게 업데이트합니까?

내 SET가 외부 조인 된 테이블을 참조하는 업데이트 쿼리를 작성해야합니다.

SQL Server에서는이 작업을 매우 쉽게 수행 할 수 있지만 업데이트 쿼리에서 단일 테이블 만 허용하므로 Oracle에서 구문을 파악하는 데 시간이 많이 걸립니다.

나는 다음과 같은 오라클 쿼리 작성했습니다

:

UPDATE SalesExt_tmp tmp 
SET slsrep = (SELECT three_dig_rep 
       FROM dw_sls_rep_conv sls 
       WHERE sls.aims_rep = tmp.slsrep) 
WHERE EXISTS (SELECT three_dig_rep 
       FROM dw_sls_rep_conv sls 
       WHERE sls.aims_rep = tmp.slsrep) 
      AND tmp.sysind = 'AIM'; 

이 교차을 담당하지만 dw_sls_rep_conv에 해당하는 일치가없는 SalesExt_tmp의 값 처리 할 필요가 (내가 case 문을 추가 할 계획을 null 값을 기본값으로 설정). 이렇게하려면 dw_sls_rep_conv를 외부 조인 된 테이블로 설정해야합니다. 그러나 이것이 내가 붙어있는 곳입니다.

SQL 서버 예 솔루션은 당신이 업데이트 쿼리에 여러 테이블을 가질 수있는 케이크 한 조각이 SQL 서버에서

:

UPDATE SalesExt_tmp tmp 
LEFT JOIN dw_sls_rep_conv sls ON sls.aims_rep = tmp.slsrep 
SET tmp.slsrep = sls.three_dig_rep 
WHERE tmp.sysind = 'AIM'; 

하지만 수 없습니다의 삶에 대한 Oracle에서이 작업을 수행하는 방법을 알아 냈습니다. 이 쿼리는 내 slsrep 필드가 NULL로 설정되어이 작업이 허용되지 않을 수도 있음을 두려워하게한다는 것을 이해합니다.

질문

1) 우선 오라클이 가능하다? (이게 맞을거야?)

2)이 문제를 해결하려면 쿼리를 어떻게 다시 구성해야합니까? 내 EXISTS 절을 갈 필요가 내 짐작 해요 ...하지만 여전히 내 JOIN 배치 할 위치에 붙어 있어요.

답변

3

정확하게 이해했다면 dw_sls_rep_conv 테이블에 일치하는 항목이 없으면 값을 NULL로 설정 하시겠습니까? 그렇다면, 당신의 EXISTS 조건을 삭제하고 모든 행이 업데이트됩니다

UPDATE SalesExt_tmp tmp 
SET slsrep = (SELECT three_dig_rep 
       FROM dw_sls_rep_conv sls 
       WHERE sls.aims_rep = tmp.slsrep) 
WHERE tmp.sysind = 'AIM'; 

dw_sls_rep_conv 테이블의 일치, 다음 slsrep 열이 선택 값으로 업데이트 될 예정이있는 경우, 그렇지 않으면 NULL와 함께. 이 같은 언급 한 바와 같이

+0

이 오 와우 .... 그건 너무 쉽게했다! 이것은 정확히 내가하고 싶었던 ... 감사합니다! 나는 여전히 SQL Server와 Oracle Update Queries 사이의 로직 차이점에 대해 두뇌를 표현하려고 노력 중이다. 하지만 지금은 어떻게 작동하는지 .... 내 WHERE 조건은 업데이트 될 항목을 설정하고 내 SET는 업데이트 할 값을 정의합니다. 사이의 차이는 null로 설정됩니다. – DanK

2

은 바깥을 수행하여 where 절에 서브 쿼리를 사용하여 고려 조인 유무 :

UPDATE SalesExt_tmp tmp 
SET slsrep = (SELECT three_dig_rep 
FROM dw_sls_rep_conv sls WHERE sls.aims_rep = tmp.slsrep)  
WHERE 
tmp.rowid in 
(SELECT tmp1.rowid 
FROM SalesExt_tmp tmp1, 
     dw_sls_rep_conv sls 
WHERE 
tmp1.slsrep = sls.aims_rep (+) 
AND tmp1.sysind = 'AIM'); 
+0

고마워, 내가 게시 한 직후에이 길을 탐험하기 시작했다. 그리고 이것은 확실히 효율적이기는하지만 확실히 잘 작동 할 것이다. 게시물을 감사드립니다! – DanK