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

1voto

Dan Anderson Punkte 29
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 und B sind Alias-Felder, Sie müssen die Tabelle nicht angeben.

1voto

Edu Castrillon Punkte 507

Nur der Vollständigkeit halber, und weil wir von Oracle sprechen, könnte dies auch funktionieren:

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

0voto

user5685973 Punkte 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`

0voto

Rob Punkte 2256

Oracle Base hat eine gute Übersicht darüber.

https://oracle-base.com/articles/misc/updates-based-on-queries

Von diesem Link - Ich habe eine Änderung der obigen Abfrage verwendet, die für mich nicht funktionierte (die Antwort von mathguy, die rowid verwendet)

MERGE /*+ APPEND PARALLEL(8) */ INTO dest_table tt
USING source_table st
ON (tt.identifier = st.identifier)
WHEN MATCHED THEN
  UPDATE SET tt.number = st.number;

Hier habe ich zwei Tabellen: source und dest. Beide haben ein Varchar-Feld gemeinsam, und ich füge das Identifikationsfeld der Quelle (PK) in die Zieltabelle ein.

-3voto

test Punkte 11
update table1  a 
   set a.col1='Y' 
 where exists(select 1 
                from table2 b
               where a.col1=b.col1 
                 and a.col2=b.col2
             )

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