sql >> Database >  >> RDS >> Oracle

Kan iemand uitleggen wat de MERGE-instructie echt doet in Oracle?

wat voor soort join wordt uitgevoerd? Ik denk dat het een volledige outer join is, nietwaar?

Nee, het is een gewone outer join. De query moet weten wanneer er rijen in de doeltabel zijn die zich ook in de brontabel bevinden en wanneer er records in de brontabel zijn die niet in de doeltabel staan. Aangezien de query niet hoeft te reageren op rijen die in de doeltabel staan ​​maar niet in de brontabel, heeft de outer join niet nodig om beide kanten op te gaan.

De outer join wordt echter niet uitgevoerd als er geen not matched . is clausule (die volkomen geldig is). De optimizer is slim genoeg om te weten dat in dat geval een inner join voldoende is.

met betrekking tot het gedeelte WHEN MATCHED:wat gebeurt er als een rij vanaf t overeenkomt met meerdere rijen vanaf s?

Als er meerdere matches zijn, wordt de update voor elke match uitgevoerd. Dit betekent dat de update die het laatst komt, degene is die in de commit is geschreven. Er is geen manier om een ​​volgorde te dicteren, dus in dit geval is de bron van de update in feite willekeurig (uit de reeks overeenkomsten).

Zoals @ Vincent Malgrat opmerkte, was dit onjuist. Het lijkt erop dat Oracle de foutmelding "ORA-40926:kan een stabiele set rijen in de brontabel niet krijgen" zal produceren als er meerdere overeenkomsten zijn.

met betrekking tot het WHEN NOT MATCHED-gedeelte Ik geloof dat het betekent "wanneer een rij in s geen correspondentie heeft in t". Heb ik gelijk?

Dat klopt.




  1. MySQL SELECTEER LIKE of REGEXP om meerdere woorden in één record te matchen

  2. Beperkingen tijdelijk uitschakelen (MS SQL)

  3. Cyclusdetectie met recursieve subqueryfactoring

  4. kan eenvoudige PostgreSQL-insertie niet aan het werk krijgen