Oracle
 sql >> Base de données >  >> RDS >> Oracle

Quelqu'un pourrait-il expliquer ce que fait réellement l'instruction MERGE dans Oracle?

quel type de jointure est effectuée ? Je pense qu'il s'agit d'une jointure externe complète, n'est-ce pas ?

Non, c'est une jointure externe normale. La requête doit savoir quand il y a des lignes dans la table cible qui sont également dans la table source et quand il y a des enregistrements dans la table source qui ne sont pas dans la table cible. Étant donné que la requête n'a pas besoin de répondre aux lignes qui se trouvent dans la table cible mais pas dans la table source, elle n'a pas besoin de la jointure externe pour aller dans les deux sens.

Cependant, la jointure externe ne sera pas effectuée s'il n'y a pas de not matched clause (qui est parfaitement valide). L'optimiseur est assez intelligent pour savoir que dans ce cas, une jointure interne est suffisante.

concernant la partie WHEN MATCHED :que se passe-t-il lorsqu'une ligne de t correspond à plusieurs lignes de s ?

Lorsqu'il y a plusieurs correspondances, la mise à jour est effectuée pour chaque correspondance. Cela signifie que la dernière mise à jour sera celle écrite dans le commit. Il n'y a aucun moyen de dicter un ordre, donc dans ce cas, la source de la mise à jour est effectivement aléatoire (parmi l'ensemble des correspondances).

Comme l'a souligné @ Vincent Malgrat, c'était incorrect. Il semble qu'Oracle produise une erreur "ORA-40926 :impossible d'obtenir un ensemble stable de lignes dans la table source" s'il y a plusieurs correspondances.

concernant la partie WHEN NOT MATCHED, je crois que cela signifie "quand une ligne dans s n'a pas de correspondance dans t". Ai-je raison ?

C'est exact.