sql >> Databasteknik >  >> RDS >> Oracle

Kan någon förklara vad MERGE-satsen verkligen gör i Oracle?

vilken typ av sammanfogning utförs? Jag tror att det är full yttre sammanfogning, eller hur?

Nej, det är en vanlig yttre sammanfogning. Frågan måste veta när det finns rader i måltabellen som också finns i källtabellen och när det finns poster i källtabellen som inte finns i måltabellen. Eftersom frågan inte behöver svara på rader som finns i måltabellen men inte i källtabellen, behöver den inte den yttre kopplingen för att gå åt båda hållen.

Den yttre anslutningen kommer dock inte att utföras om det inte finns någon not matched klausul (som är helt giltig). Optimeraren är smart nog att veta att i så fall räcker det med en inre sammanfogning.

angående NÄR MATCHED-delen:vad händer när en rad från t matchar flera rader från s?

När det finns flera matchningar utförs uppdateringen för varje match. Det betyder att den uppdatering som kommer sist kommer att vara den som skrivs i commit. Det finns inget sätt att diktera en order, så i det här fallet är källan till uppdateringen i praktiken slumpmässig (från uppsättningen av matchningar).

Som @ Vincent Malgrat påpekade var detta felaktigt. Det verkar som om Oracle kommer att producera felet "ORA-40926:det går inte att få en stabil uppsättning rader i källtabellen" om det finns flera matchningar.

angående NÄR INTE MATCHED-delen Jag tror att det betyder "när en rad i s inte har någon korrespondens i t". Har jag rätt?

Det stämmer.




  1. Ett nätverksrelaterat eller instansspecifikt fel inträffade när en anslutning till SQL Server upprättades

  2. Tillåten minnesstorlek på 8589934592 byte är slut

  3. Hur LPAD()-funktionen fungerar i MySQL

  4. Hur kan jag undvika råvariabel längd för långa fel i SQL Developer?