sql >> Database teknologi >  >> RDS >> Oracle

Kan nogen forklare, hvad MERGE-erklæringen virkelig gør i Oracle?

hvilken slags join udføres? Jeg tror, ​​det er fuld ydre sammenføjning, ikke sandt?

Nej, det er en almindelig ydre sammenføjning. Forespørgslen skal vide, hvornår der er rækker i måltabellen, som også er i kildetabellen, og hvornår der er poster i kildetabellen, der ikke er i måltabellen. Da forespørgslen ikke behøver at svare på rækker, der er i måltabellen, men ikke er i kildetabellen, behøver den ikke den ydre joinforbindelse for at gå begge veje.

Den ydre join vil dog ikke blive udført, hvis der ikke er nogen not matched klausul (som er helt gyldig). Optimizeren er smart nok til at vide, at i så fald er en indre sammenføjning tilstrækkelig.

vedrørende NÅR MATCHED-delen:hvad sker der, når en række fra t matcher flere rækker fra s?

Når der er flere kampe, udføres opdateringen for hver kamp. Det betyder, at den opdatering, der kommer sidst, vil være den, der er skrevet i commit. Der er ingen måde at diktere en ordre på, så i dette tilfælde er kilden til opdateringen faktisk tilfældig (fra sæt af kampe).

Som @ Vincent Malgrat påpegede, var dette forkert. Det ser ud til, at Oracle vil producere en "ORA-40926:ikke i stand til at få et stabilt sæt rækker i kildetabellen", hvis der er flere matches.

angående NÅR IKKE MATCHED-delen Jeg tror det betyder "når en række i s ikke har nogen korrespondance i t". Har jeg ret?

Det er korrekt.




  1. Generering af tidsserier mellem to datoer i PostgreSQL

  2. Postgres kolonne eksisterer ikke

  3. Hvordan eksporteres data fra Oracle SQL Developer til Excel?

  4. Hvordan finder man de privilegier og roller, der er tildelt en bruger i Oracle?