Ich schreibe gerade Update-Anweisungen, um eine abfragbare Tabelle ständig auf dem neuesten Stand zu halten. Das Schema ist identisch zwischen den beiden Tabellen und die Inhalte sind nicht wichtig:Oracle SQL-Update basiert auf Unterabfrage zwischen zwei Tabellen
STAGING
ID
NAME
COUNT
PRODUCTION
ID
NAME
COUNT
Meine Update-Anweisung sieht wie folgt aus:
update PRODUCTION
set name = (select stage.name from staging stage where stage.name=name and rownum <2),
count = (select stage.countfrom staging stage where stage.count=count and rownum <2);
Die zwei Dinge bemerkenswert ist, dass 1) Es gibt keine where-Klausel bei das Ende meiner Aktualisierung (dies kann das Problem sein) und 2) alle Datensätze nach der Aktualisierung haben die gleichen Werte. Was ich damit meine, ist folgende:
BEFORE UPDATE:
1,"JOHN", 12;
2,"STEVE",15;
3,"BETTY",2;
AFTER UPDATE
1,"JOHN", 12;
2,"JOHN",12;
3,"JOHN",12;
Meine Frage ist, wie kann ich dieses Problem beheben, so dass die Tabelle spiegelt richtig „neue“ Daten als korrektes SQL-Update Staging?
UPDATE
meine Inszenierung Daten könnten zufällig So spiegeln, was in PRODUCTION
und zum Zwecke der Diskussion ist, es wird:
STAGING DATA TO MERGE:
1,"JOHN", 12;
2,"STEVE",15;
3,"BETTY",2;
UPDATE die zweite
Die Abfrage, die Ich würde gerne folgendes tun:
Dies ist jedoch in einem ungültigen Kennung Probleme Treffer zu „staging.name“
Möchten Sie ** Name ** und ** zählen ** in ** PRODUKTION ** Tabelle aktuell und ** STAGING ** Tabelle ändert sich? – hmmftg
Warum verwenden Sie keine Trigger, um neue Werte anstelle dieses Updates einzufügen? Was genau macht dieses Update? – hmmftg
Vereinbart, wenn Sie Tabellen synchronisieren, können Trigger wirklich nützlich sein, um sie in Echtzeit auf dem neuesten Stand zu halten. Achten Sie nur auf mutierende Tabellenfehler, und stellen Sie sicher, dass Sie dies NACH dem Einfügen oder Aktualisieren tun. – Hermit