Merge in eine select-Anweisung - Oracle
Ist es möglich, filter einige der Einträge zusammengeführt werden, die auf eine Tabelle mit select?
MERGE INTO (
SELECT * FROM P4PCA2_PIVOT_CA
WHERE ( CA_LIG_VTE_NUM_ID_PDT <> 0 )
) ta
USING P4DAS2_DONARTSTK tb ON (tb.NUM_ID_PDT =ta.CA_LIG_VTE_NUM_ID_PDT)
WHEN MATCHED THEN
UPDATE SET ta.COD_SECVTE_REVENT=tb.COD_SECVTE_REVENT);
- Was ist deine Frage?
- Ich wurde gebeten, eine Abfrage wie diese, und ich kann nicht ankommen es zu wirken, obwohl ich sagte, es ist möglich.
- "Kann nicht, dass es funktioniert" ist keine gültige Oracle-Fehlermeldung.
- ORA-00903: Ungültiger Tabellenname
- Bieten die View-definition.
Du musst angemeldet sein, um einen Kommentar abzugeben.
In Oracle können Sie ausführen von DML auf (einige) views oder subqueries. Die Richtlinie ist, dass wenn Oracle in der Lage ist, zum abrufen der physischen Zeile aus der Ansicht, die Ansicht aktualisierbar ist.
Daher können Sie MERGE auf eine Unterabfrage. Macht es Sinn, in einigen Fällen. Zum Beispiel nehmen wir an Sie haben eine Tabelle mit einer Spalte status. Sie Zusammenführen möchten, die neuen Informationen in diese Tabelle ein, aber ändern Sie nur die Zeilen, die
STATUS='active'
. Man könnte schreiben:Bearbeiten
Scheint es, dass diese erzeugt eine
ORA-00903
im 9iR2. Es funktioniert in 11g obwohl. Test-Skript:Etwas wie:
Nicht sicher, ob ich die Verknüpfung für die
USING
richtigen Teil basierend auf deinem Beispiel.Die Grundidee ist, wählen Sie nur die Zeilen, die Sie aktualisieren möchten innerhalb der USING-Klausel, nicht als Teil der INTO-Klausel.
Einen hacktastic workaround für Versionen unterhalb von 11g:
Erstellen Sie ein Paket auf hold variable Werte:
Erstellen Sie eine Ansicht verweisen auf die Paket.
Vor der Ausführung der merge-Anweisung, legen Sie die Paket-variable auf den Wert, den Sie wollen.
Führen Sie den merge-gegen die Ansicht.