2011-08-18 4 views
3

상관 업데이트에 대한 Oracle 10g 구문에 문제가 있습니다. PL/SQL 프로 시저에서이 코드를 처리하고 있습니다.Oracle 상관 업데이트

나는 그래서 SQL Server의 문제를 접근 것 :

UPDATE table_a a 
SET  a.prov_id=pn.prov_id, 
     a.step=1 
from (
      SELECT p.prov_id 
      FROM note n 
      INNER JOIN provider p ON n.author_id=p.user_id 
      where n.enc_id=a.enc_id 
      AND  TRUNC(n.note_time)=a.attr_date 
     ) pn 

등가 오라클 구문은 다음과 같습니다

UPDATE table_a a 
SET  a.prov_id=(
      SELECT p.prov_id 
      FROM note n 
      INNER JOIN provider p ON n.author_id=p.user_id 
      where n.enc_id=a.enc_id 
      AND  TRUNC(n.note_time)=a.attr_date 
     ), 
     a.step=1 
WHERE EXISTS (
      SELECT * 
      FROM note n 
      INNER JOIN provider p ON n.author_id=p.user_id 
      where n.enc_id=a.enc_id 
      AND  TRUNC(n.note_time)=a.attr_date 
     ) 

이 사실에 두 번, 서브 쿼리를 실행합니까? 이보다 약식 구문이 있습니까?

+0

SQL 키워드 'MERGE'를 살펴보십시오 : SQL Server와 Oracle 모두에서 지원되며 Standard SQL을 기반으로하므로이 SQL 제품간에 이식성이 뛰어납니다. – onedaywhen

답변

5

하위 쿼리가 두 번 실행되는지 여부는 EXPLAIN PLAN을 사용하십시오.

내가 대신 이러한 상관 관계가 업데이트 업데이트의 병합 명령을 사용하려면, 같은 : (당신이 테스트 대답을 원하는 경우 테스트하지, DDL을 제공하고 문을 삽입하시기 바랍니다.)

merge into table_a TRGT 
using (select P.prov_id, N.enc_id, trunc(n.note_time) as trunc_note_time 
    from note N 
    inner join provider P ON N.author_id=P.user_id) SRC 
on (TRGT.enc_id = SRC.enc_id and TRGT.attr_date = SRC.trunc_note_time) 
when matched then update set prov_id = SRC.prov_id 
    , step = 1 

때때로 당신을 다음과 같은 인라인보기를 업데이트 할 수 있습니다.

update (select A.prov_id, A.step, P.prov_id as p_prov_id 
    from note N 
    inner join provider P on N.author_id=p.user_id 
    inner join table_a A 
     on N.enc_id=A.enc_id 
     and trunc(N.note_time)=A.attr_date) 
set prov_id = p_prov_id 
    , step = 1 

인라인보기 버전이 항상 작동하지 않습니다. 오류에 대한 정보를 찾을 수는 없지만 기본적으로 인라인보기에는 Oracle이 문제의 테이블로 다시 연결할 수있는 고유 한 키가 있어야합니다.