Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Alguém poderia explicar o que a instrução MERGE realmente faz no Oracle?


que tipo de junção é realizada? Acho que é full outer join, certo?

Não, é uma junção externa regular. A consulta precisa saber quando há linhas na tabela de destino que também estão na tabela de origem e quando há registros na tabela de origem que não estão na tabela de destino. Como a consulta não precisa responder a linhas que estão na tabela de destino, mas não estão na tabela de origem, ela não precisa da junção externa para ir nos dois sentidos.

No entanto, a junção externa não será executada se não houver not matched cláusula (que é perfeitamente válida). O otimizador é inteligente o suficiente para saber que, nesse caso, uma junção interna é suficiente.

em relação à parte WHEN MATCHED:o que acontece quando uma linha de t corresponde a várias linhas de s?

Quando há várias partidas, a atualização é realizada para cada partida. Isso significa que qualquer atualização que vier por último será aquela escrita no commit. Não há como ditar uma ordem, portanto, neste caso, a fonte da atualização é efetivamente aleatória (do conjunto de correspondências).

Como @ Vincent Malgrat apontou, isso estava incorreto. Parece que o Oracle produzirá um erro "ORA-40926:incapaz de obter um conjunto estável de linhas na tabela de origem" se houver várias correspondências.

em relação à parte WHEN NOT MATCHED Ibelieve significa “quando uma linha em s não tem correspondência em t”. Estou certo?

Está correto.