복붙노트

[SQL] 내부와 업데이트 문은 오라클에 합류

SQL

내부와 업데이트 문은 오라클에 합류

내가 MySQL의에서 잘 작동하는 쿼리를 가지고,하지만 난 오라클 나는 그것을 실행할 때 다음과 같은 오류가 발생합니다 :

쿼리는 다음과 같습니다

UPDATE table1
INNER JOIN table2 ON table1.value = table2.DESC
SET table1.value = table2.CODE
WHERE table1.UPDATETYPE='blah';

해결법

  1. ==============================

    1.그 구문은 오라클에서는 유효하지 않습니다. 이 작업을 수행 할 수 있습니다 :

    그 구문은 오라클에서는 유효하지 않습니다. 이 작업을 수행 할 수 있습니다 :

    UPDATE table1 SET table1.value = (SELECT table2.CODE
                                      FROM table2 
                                      WHERE table1.value = table2.DESC)
    WHERE table1.UPDATETYPE='blah'
    AND EXISTS (SELECT table2.CODE
                FROM table2 
                WHERE table1.value = table2.DESC);
    

    또는 당신은이 작업을 수행 할 수 있습니다 :

    UPDATE 
    (SELECT table1.value as OLD, table2.CODE as NEW
     FROM table1
     INNER JOIN table2
     ON table1.value = table2.DESC
     WHERE table1.UPDATETYPE='blah'
    ) t
    SET t.OLD = t.NEW
    

    인라인 뷰가 오라클에 의해 업데이트 할 수있는 것으로 간주되는 경우는 의존 (두 번째 문에 대한 갱신 가능하려면 나열된 몇 가지 규칙에 따라 달라집니다 여기 ).

  2. ==============================

    2.이 옵션을 사용합니다 :

    이 옵션을 사용합니다 :

    MERGE
    INTO    table1 trg
    USING   (
            SELECT  t1.rowid AS rid, t2.code
            FROM    table1 t1
            JOIN    table2 t2
            ON      table1.value = table2.DESC
            WHERE   table1.UPDATETYPE='blah'
            ) src
    ON      (trg.rowid = src.rid)
    WHEN MATCHED THEN UPDATE
        SET trg.value = code;
    
  3. ==============================

    3.WHERE 절 MERGE :

    WHERE 절 MERGE :

    MERGE into table1
    USING table2
    ON (table1.id = table2.id)
    WHEN MATCHED THEN UPDATE SET table1.startdate = table2.start_date
    WHERE table1.startdate > table2.start_date;
    

    당신은 절 ON 절에서 참조 열을 업데이트 할 수 없기 때문에 WHERE해야합니다.

  4. ==============================

    4.

     UPDATE ( SELECT t1.value, t2.CODE
              FROM table1 t1
              INNER JOIN table2 t2 ON t1.Value = t2.DESC
              WHERE t1.UPDATETYPE='blah')
     SET t1.Value= t2.CODE
    
  5. ==============================

    5.위의 답변 중 일부를 사용하지 마십시오.

    위의 답변 중 일부를 사용하지 마십시오.

    일부는 그렇게하지 않습니다, 그것은 극심한 느린, 중첩 된 SELECT의 사용을 제안한다. 업데이트에 많은 레코드가있는 경우, 사용하는 같은, 그래서 가입 :

    update (select bonus 
            from employee_bonus b 
            inner join employees e on b.employee_id = e.employee_id 
            where e.bonus_eligible = 'N') t
    set t.bonus = 0;
    

    자세한 내용은이 링크를 참조하십시오. http://geekswithblogs.net/WillSmith/archive/2008/06/18/oracle-update-with-join-again.aspx.

    또한, 당신이 가입하는 모든 테이블에 기본 키가 있는지 확인하십시오.

  6. ==============================

    6.여기 바와 같이, 토니 앤드류스에 의해 제안 된 최초의 솔루션에 대한 일반적인 구문은 다음과 같습니다

    여기 바와 같이, 토니 앤드류스에 의해 제안 된 최초의 솔루션에 대한 일반적인 구문은 다음과 같습니다

    update some_table s
    set   (s.col1, s.col2) = (select x.col1, x.col2
                              from   other_table x
                              where  x.key_value = s.key_value
                             )
    where exists             (select 1
                              from   other_table x
                              where  x.key_value = s.key_value
                             )
    

    나는이 업데이트 하나 개 이상의 필드를 원하는 특히 흥미로운 생각합니다.

  7. ==============================

    7.이 다음 구문 나를 위해 작동합니다.

    이 다음 구문 나를 위해 작동합니다.

    UPDATE
    (SELECT A.utl_id,
        b.utl1_id
        FROM trb_pi_joint A
        JOIN trb_tpr B
        ON A.tp_id=B.tp_id Where A.pij_type=2 and a.utl_id is null
    )
    SET utl_id=utl1_id;
    
  8. ==============================

    8.표 2에 대한 설명을 대신 DESC를 사용하여,

    표 2에 대한 설명을 대신 DESC를 사용하여,

    update
      table1
    set
      value = (select code from table2 where description = table1.value)
    where
      exists (select 1 from table2 where description = table1.value)
      and
      table1.updatetype = 'blah'
    ;
    
  9. ==============================

    9.그것은 잘 오라클을 작동

    그것은 잘 오라클을 작동

    merge into table1 t1
    using (select * from table2) t2
    on (t1.empid = t2.empid)
    when matched then update set t1.salary = t2.salary
    
  10. ==============================

    10.

    UPDATE table1 t1
    SET t1.value = 
        (select t2.CODE from table2 t2 
         where t1.value = t2.DESC) 
    WHERE t1.UPDATETYPE='blah';
    
  11. ==============================

    11.

    UPDATE IP_ADMISSION_REQUEST ip1
    SET IP1.WRIST_BAND_PRINT_STATUS=0
    WHERE IP1.IP_ADM_REQ_ID        =
      (SELECT IP.IP_ADM_REQ_ID
      FROM IP_ADMISSION_REQUEST ip
      INNER JOIN VISIT v
      ON ip.ip_visit_id=v.visit_id
      AND v.pat_id     =3702
      ); `enter code here`
    
  12. ==============================

    12.우리가 오라클을 이야기하고 있기 때문에 그냥 완전성의 문제로하고,이뿐만 아니라 그것을 할 수 있습니다 :

    우리가 오라클을 이야기하고 있기 때문에 그냥 완전성의 문제로하고,이뿐만 아니라 그것을 할 수 있습니다 :

    declare
    begin
      for sel in (
        select table2.code, table2.desc
        from table1
        join table2 on table1.value = table2.desc
        where table1.updatetype = 'blah'
      ) loop
        update table1 
        set table1.value = sel.code
        where table1.updatetype = 'blah' and table1.value = sel.desc;    
      end loop;
    end;
    /
    
  13. ==============================

    13.

    UPDATE (SELECT T.FIELD A, S.FIELD B
    FROM TABLE_T T INNER JOIN TABLE_S S
    ON T.ID = S.ID)
    SET B = A;
    

    A와 B는 테이블을 지적 할 필요가 없습니다, 별명 필드입니다.

  14. ==============================

    14.

    update table1  a 
       set a.col1='Y' 
     where exists(select 1 
                    from table2 b
                   where a.col1=b.col1 
                     and a.col2=b.col2
                 )
    
  15. from https://stackoverflow.com/questions/2446764/update-statement-with-inner-join-on-oracle by cc-by-sa and MIT license