[sql] Oracle에서 내부 조인이 포함 된 명령문 업데이트

MySQL에서 잘 작동하는 쿼리가 있지만 Oracle에서 실행할 때 다음 오류가 발생합니다.

SQL 오류 : ORA-00933 : SQL 명령이 제대로 종료되지 않았습니다.
00933. 00000- “SQL 명령이 제대로 종료되지 않았습니다.”

쿼리는 다음과 같습니다.

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



답변

이 구문은 Oracle에서 유효하지 않습니다. 당신은 이것을 할 수 있습니다 :

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

Oracle에서 인라인보기를 업데이트 할 수 있는지 여부에 따라 다릅니다 (두 번째 명령문의 업데이트 가능 여부는 여기에 나열된 일부 규칙에 따라 다릅니다
).


답변

이것을 사용하십시오 :

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;


답변

MERGEwith WHERE절 :

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;

WHERE절에서 참조 된 열을 ON업데이트 할 수 없으므로 절이 필요합니다 .


답변

 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


답변

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

일부는 중첩 된 SELECT의 사용을 제안하지만 그렇게하지 마십시오. 매우 느립니다. 업데이트 할 레코드가 많으면 join을 사용하십시오.

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 .

또한 결합하는 모든 테이블에 기본 키가 있는지 확인하십시오.


답변

여기 에 표시된 것처럼 Tony Andrews가 제안한 첫 번째 솔루션의 일반적인 구문은 다음과 같습니다.

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
                         )

하나 이상의 필드를 업데이트하려는 경우 특히 흥미로운 것으로 생각됩니다.


답변

이 다음 구문은 저에게 효과적입니다.

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;