2016-04-22 24 views
0

stieß ich auf zwei Beispiel in Bezug auf MERGE mit bedingter DMLConditional DELETE/INSERT/UPDATE in MERGE

First example,

MERGE INTO bonuses D 
    USING (SELECT employee_id, salary, department_id FROM employees 
    WHERE department_id = 80) S 
    ON (D.employee_id = S.employee_id) 
    WHEN MATCHED THEN UPDATE SET D.bonus = D.bonus + S.salary*.01 
    DELETE WHERE (S.salary > 8000) 
    WHEN NOT MATCHED THEN INSERT (D.employee_id, D.bonus) 
    VALUES (S.employee_id, S.salary*.01) 
    WHERE (S.salary <= 8000); 

ich zu verstehen, neigen dazu, dass in MERGE, nur die Zieltabelle (D hier) ist modifiziert. Wenn wir eine DML in WHEN setzen, soll es auf die Zieltabelle D wirken. Also in diesem Fall, was die Bedingungen mit S zu tun haben, wie in der DELETE und UPDATE Klausel. Wann kommen die WHERE zum Einsatz? Nach dem Abgleich? Auf der Quelle/Ziel vor ON?

Another related example mit einer weiteren Frage

MERGE INTO destination d 
    USING source s 
    ON (s.id = d.id) 
    WHEN MATCHED THEN 
    UPDATE SET d.description = 'Updated', 
       d.status = 10 
    DELETE WHERE s.status = 10; 

und

MERGE INTO destination d 
    USING source s 
    ON (s.id = d.id) 
    WHEN MATCHED THEN 
    UPDATE SET d.description = 'Updated', 
       d.status = 10 
    DELETE WHERE d.status = 10; 

Ich habe nicht den Unterschied zwischen zwei Szenarien: Quelle im Vergleich zu Zieltabelle in der WHERE Klausel.

Vielen Dank im Voraus.

Antwort

0

Die MERGE-Operation besteht aus zwei Teilen: WAS ist eine Aktion (Aktualisierung irgendeiner Art, einschließlich Einfügungen und Löschungen) - dies geschieht immer NUR auf der Zieltabelle; und WANN, um die Aktion auszuführen - welche Bedingung muss erfüllt sein, um das Update zu initiieren? Die Bedingung muss sich auf etwas in der Zieltabelle beziehen, bezieht sich aber auch auf die Quelltabelle.

In Ihrem ersten Beispiel: Die Zieltabelle hat nur Mitarbeiter-IDs und Bounses. Sie möchten jeden Bonus um 1% des Grundgehalts für jeden Mitarbeiter erhöhen - und einen Bonus (wenn es für diesen Mitarbeiter keine Zeile gab) für Mitarbeiter hinzufügen, denen überhaupt kein Bonus zugewiesen wurde. Sie können also nicht nur auf die Zieltabelle schauen, sondern auch woanders suchen, wo die Gehälter gespeichert werden. In diesem Fall stellt "WHEN MATCHED" sicher, dass Sie in beiden Tabellen dieselbe Mitarbeiter-ID sehen. Dann erhöhen Sie den Bonus um 1% des Grundgehalts; Grundgehalt wird aus der Quelltabelle gelesen. Dann löschen Sie den Bonus vollständig (es gibt keine Zeile für die Mitarbeiter-ID in der Tabelle BONUS), wenn der Mitarbeiter ein Grundgehalt von mehr als 80.000 hat - das muss eine Geschäftsentscheidung sein, die sich in der Datenbank widerspiegelt. Sie sehen also, wie Sie auf Daten an anderen Stellen als der Zieltabelle verweisen müssen, obwohl die Änderungen selbst nur das Ziel betreffen.

In Ihrem zweiten Beispiel wird der Effekt gleich sein.

0

Im ersten Beispiel 1. Mitarbeiter der Abteilung 80 sind identifiziert. Diese Mitarbeiter haben möglicherweise einen Bonus-Rekord gegen ihre Mitarbeiter-ID in der Bonus-Tabelle. 2. Wenn bereits ein Bonus in Boni vorhanden ist, erhöhen Sie den Bonus in Boni für diesen Mitarbeiter um 1 Prozent seines Gehalts. Danach, wenn das Gehalt des Angestellten mehr als 8000 beträgt, darf er keinen Bonus haben, also entferne seinen Bonus-Rekord von den Boni. 3. Wenn noch kein Bonus vorhanden ist und ein Gehalt von nicht mehr als 8000 Mitarbeitern einen neuen Bonusrekord enthält.

Die Reihenfolge, in diesem Fall für die Zwecke Verständnis ON wäre, WHEN MATCHED, zu aktualisieren, WO, DELETE, WHEN NOT MATCHED, WO, INSERT

Im zweiten Beispiel, Abfrage 1: Wenn Quelle Datensatz vorhanden in Ziel, a. Aktualisierung der Zielbeschreibung und des Status b. Wenn der Quellstatus 10 lautet, löschen Sie den Datensatz mit derselben ID aus dem Ziel.

Abfrage 2: Wenn der Quelldatensatz im Ziel existiert, a. Aktualisierung der Zielbeschreibung und des Status b. Löschen Sie dann diesen Datensatz vom Ziel.

In Abfrage2 ist das Update redundant, es sei denn, es gibt Trigger, die andere Tabellen aktualisieren.

Die Reihenfolge, in diesem Fall für die Zwecke Verständnis ON wäre, WHEN MATCHED, zu aktualisieren, WO, DELETE

Hoffnung, das hilft.