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

Qualcuno potrebbe spiegare cosa fa davvero l'istruzione MERGE in Oracle?

che tipo di join viene eseguito? Penso che sia un join esterno completo, giusto?

No, è un normale outer join. La query deve sapere quando sono presenti righe nella tabella di destinazione che sono anche nella tabella di origine e quando sono presenti record nella tabella di origine che non sono nella tabella di destinazione. Poiché la query non deve rispondere alle righe che si trovano nella tabella di destinazione ma non nella tabella di origine, non è necessario che l'outer join vada in entrambe le direzioni.

Tuttavia, il join esterno non verrà eseguito se non è presente alcun not matched clausola (che è perfettamente valida). L'ottimizzatore è abbastanza intelligente da sapere che in tal caso è sufficiente un inner join.

per quanto riguarda la parte QUANDO ABBINATO:cosa succede quando una riga da t corrisponde a più righe da s?

Quando ci sono più corrispondenze, l'aggiornamento viene eseguito per ogni partita. Ciò significa che l'ultimo aggiornamento che arriva per ultimo sarà quello scritto nel commit. Non c'è modo di dettare un ordine, quindi in questo caso la fonte dell'aggiornamento è effettivamente casuale (dal set di corrispondenze).

Come ha sottolineato @Vincent Malgrat, questo non era corretto. Sembra che Oracle produrrà un errore "ORA-40926:impossibile ottenere un set stabile di righe nella tabella di origine" se sono presenti più corrispondenze.

per quanto riguarda la parte QUANDO NON ABBINATO credo significhi “quando una riga in s non ha corrispondenza in t”. Ho ragione?

Esatto.