Ich habe eine Abfrage, die in MySQL gut funktioniert, aber wenn ich sie unter Oracle ausführe, wird folgende Fehlermeldung angezeigt:
SQL-Fehler: ORA-00933: SQL-Befehl nicht ordnungsgemäß beendet
00933. 00000 - "SQL-Befehl nicht ordnungsgemäß beendet"
Die Abfrage lautet:
UPDATE table1
INNER JOIN table2 ON table1.value = table2.DESC
SET table1.value = table2.CODE
WHERE table1.UPDATETYPE='blah';
sql
oracle
inner-join
ora-00933
user169743
quelle
quelle
Antworten:
Diese Syntax ist in Oracle nicht gültig. Du kannst das:
Oder Sie können dies tun:
Dies hängt davon ab, ob die Inline-Ansicht von Oracle als aktualisierbar angesehen wird ( Die Aktualisierung für die zweite Anweisung hängt von einigen hier aufgeführten Regeln ab ).
quelle
Benutze das:
quelle
merge into table 1 t
dies zu sagen und so weiter.ON
,trg
ist der Alias für die Mastertabelletable1
("äußere" Tabelle nach Ihrer Logik) undsrc
verweist auf dieUSING
Gruppe ("innere Tabelle" nach Ihrer Logik). Aber ja, wahrscheinlich hätte man besser darauf verweisen können, aber ich konnte ihm folgen.MERGE
mitWHERE
Klausel:Sie benötigen die
WHERE
Klausel, da Spalten, auf die in derON
Klausel verwiesen wird , nicht aktualisiert werden können.quelle
quelle
Verwenden Sie einige der obigen Antworten nicht.
Einige schlagen die Verwendung von verschachteltem SELECT vor, tun Sie das nicht, es ist unerträglich langsam. Wenn Sie viele Datensätze aktualisieren müssen, verwenden Sie join.
Siehe diesen Link für weitere Details. http://geekswithblogs.net/WillSmith/archive/2008/06/18/oracle-update-with-join-again.aspx .
Stellen Sie außerdem sicher, dass in allen Tabellen, denen Sie beitreten, Primärschlüssel vorhanden sind.
quelle
Wie hier angegeben , lautet die allgemeine Syntax für die erste von Tony Andrews vorgeschlagene Lösung:
Ich denke, das ist besonders interessant, wenn Sie mehr als ein Feld aktualisieren möchten.
quelle
Diese folgende Syntax funktioniert für mich.
quelle
SET
a ausgeführtREPLACE
und versucht, eine bestimmte Zeichenfolge in der Spalte''
zu löschen - Oracle-Behandlungen als null behandelt werden und dieses Feld nicht null gesetzt werden konnte. Ich dachte, die Syntax würde lediglich eine temporäre Tabelle anstelle der echten aktualisieren, aber ich habe mich geirrt.Verwenden Sie description anstelle von desc für table2.
quelle
Es funktioniert gut Orakel
quelle
t1.First_Name = t2.FirstName, t1.Last_Name = t2.LastName
eine Tabelle bearbeiten, nachdem ich sie in der Spalte "UserName" (t1.UserName = t2.UserName
) abgeglichen hatte , um ihren Namen aus einer Tabelle namens UserInfo (select * from UserInfo) t2
) abzurufen . In der Datenbank wurde UserName überall als Primärschlüssel für UserInfo verwendet, anstatt FirstName und LastName direkt in der Tabelle zu platzieren. Das hat das behoben!quelle
quelle
Der Vollständigkeit halber und weil es sich um Oracle handelt, könnte dies auch so sein:
quelle
A und B sind Aliasfelder, Sie müssen nicht auf die Tabelle zeigen.
quelle
quelle