385 Stimmen

Aktualisierungsanweisung mit innerem Join auf Oracle

Ich habe eine Abfrage, die in MySQL gut funktioniert, aber wenn ich sie in Oracle ausführe, erhalte ich folgenden Fehler:

SQL-Fehler: ORA-00933: SQL-Befehl nicht ordnungsgemäß beendet
00933. 00000 - "SQL-Befehl nicht ordnungsgemäß beendet"

Die Frage lautet:

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

530voto

Tony Andrews Punkte 125904

Diese Syntax ist in Oracle nicht gültig. Sie können dies tun:

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);

Oder Sie könnte in der Lage sein, dies zu tun:

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

Es hängt davon ab, ob die Inline-Ansicht von Oracle als aktualisierbar angesehen wird ( _Die Aktualisierbarkeit der zweiten Aussage hängt von einigen Regeln ab, die hier aufgeführt sind aquí_ ).

244voto

Quassnoi Punkte 396418

Verwenden Sie dies:

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;

43voto

Roland Punkte 6970

MERGE con WHERE Klausel:

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;

Sie benötigen die WHERE Klausel, weil Spalten, auf die in der ON Klausel kann nicht aktualisiert werden.

23voto

duvo Punkte 1564

Einige der oben genannten Antworten dürfen nicht verwendet werden.

Einige schlagen die Verwendung von verschachtelten SELECT vor, tun Sie das nicht, es ist unerträglich langsam. Wenn Sie viele Datensätze zu aktualisieren haben, verwenden Sie join, also etwas wie:

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;

Unter diesem Link finden Sie weitere Einzelheiten. http://geekswithblogs.net/WillSmith/archive/2008/06/18/oracle-update-with-join-again.aspx .

Vergewissern Sie sich auch, dass alle Tabellen, die Sie verbinden, Primärschlüssel haben.

15voto

Morten Anderson Punkte 2244
 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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X