Oracle-SQL-update-basierend auf Unterabfrage zwischen zwei Tabellen
Ich bin derzeit am schreiben von update-Anweisungen zu halten, eine Abfrage-Tabelle können ständig up to date. Das schema ist identisch zwischen den beiden Tabellen und die Inhalte sind nicht wichtig:
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);
Zwei Dinge beachten ist, dass 1) Es gibt keine where-Klausel am Ende von meinem update (kann dies das problem sein) und 2) alle Datensätze, nachdem er aktualisiert die gleichen Werte haben. Was ich damit meine, ist Folgendes:
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 korrekt widerspiegelt "neuen" Daten von Inszenierung als eine korrekte SQL-update?
UPDATE
Also meine staging-Daten könnten zufällig Spiegel, was ist in PRODUCTION
und wegen der Diskussion wird es:
STAGING DATA TO MERGE:
1,"JOHN", 12;
2,"STEVE",15;
3,"BETTY",2;
UPDATE die zweite
Die Abfrage, die ich gerne ausführen würde, dann dies:
update PRODUCTION
set production.name = staging.name,
production.count = staging.count
where production.name = staging.name;
Dies jedoch resultiert in Ungültiger Bezeichner Probleme auf "die Inszenierung.name"
- Wollen Sie name und zählen in PRODUKTION - Tabelle up-to date und STAGING Tabelle ändern?
- Warum nutzen Sie nicht die Trigger zum einfügen neuer Werte statt dieses update? was macht dieses update genau?
- Vereinbart, bei der Synchronisierung von Tabellen, Triggern kann wirklich nützlich halten Sie up to date in Echtzeit. Just watch out für die mutierenden Tabelle Fehler, und sicher sein, es zu tun, als NACH der INSERT-ODER UPDATE.
- Dieses update ist nur zum ziehen von Daten aus staging, um damit die Produktion auf dem neuesten Stand. Ähnlich wie Wetter Berichte gibts für ein real-life Beispiel. Alle X Minuten oder so
- Dies wird höchstwahrscheinlich zu einem trigger, ich bin die Erprobung der plain-sql von selbst.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es zwei Möglichkeiten, das zu tun, was Sie versuchen,
Ist ein Multi-Spalte Korreliert Update
DEMO
Können Sie merge
DEMO
Versuchen Sie es ..
Als Sie aufgefallen, Sie haben keine Selektivität zu Ihrem update-Anweisung, damit es aktualisiert Ihre gesamte Tabelle. Wenn Sie aktualisieren möchten bestimmte Zeilen (dh dort, wo die IDs übereinstimmen) werden Sie wahrscheinlich wollen eine koordinierte Unterabfrage.
Jedoch, da Sie Oracle verwenden, könnte es einfacher sein, erstellen Sie eine materialisierte Ansicht für die Abfrage-Tabelle und lassen Sie die Oracle-Transaktion Mechanismus, der die details kümmern. MVs arbeiten genau wie eine Tabelle für die Abfrage Semantik, sind sehr leicht und ermöglichen Ihnen die Angabe des Aktualisierungsintervalls.
Ohne Beispiele aus dem dataset für die Inszenierung dieses ist ein Schuss im Dunkeln, aber haben Sie versucht, so etwas wie das?
Dieser würde funktionieren, vorausgesetzt, die id-Spalte entspricht, die auf beide Tabellen.