Dépannage d'une requête de mise à jour indéfinie avec jointure dans Oracle
Lors de l'exécution de la requête UPDATE suivante :
UPDATE table1 t1 SET (t1.col,t1.Output) = ( SELECT t2.col, t3.Output + t2.col FROM tabl2 t3 LEFT JOIN table1 t2 ON t3.Join_Key = t2.Join_Key WHERE t2.col is not NULL);
utilisateurs peut rencontrer une erreur d'exécution indéfinie. Cet article approfondit le problème et propose une solution.
Le problème : les résultats de sous-requête non uniques
La cause première de l'erreur réside dans la sous-requête dans UPDATE déclaration. À moins que la sous-requête ne renvoie une seule ligne pour chaque ligne de la table1, l'opération de mise à jour échouera. Le LEFT JOIN dans la sous-requête permet plusieurs lignes correspondantes, conduisant potentiellement à une mise à jour non déterministe.
Solution : garantir les retours d'une sous-requête sur une seule ligne
Pour résoudre le problème problème, une condition est nécessaire pour relier les lignes de la table1 aux lignes de la sous-requête, garantissant que la sous-requête renvoie une seule ligne. Ceci peut être réalisé en ajoutant une condition de jointure qui fait correspondre les lignes par une clé unique :
UPDATE table1 t1 SET (t1.col,t1.Output) = ( SELECT t2.col, t3.Output + t2.col FROM tabl2 t3 LEFT JOIN table1 t2 ON t3.Join_Key = t2.Join_Key WHERE t2.col is not NULL AND t1.some_key = t2.some_key);
Adressage de la portée de la mise à jour
Une autre considération est le fait que le L'instruction UPDATE peut affecter toutes les lignes du tableau 1. Il est important d'évaluer s'il s'agit du comportement souhaité ou si une mise à jour plus sélective est nécessaire. En incluant des conditions WHERE supplémentaires dans l'instruction UPDATE, les utilisateurs peuvent limiter la portée de la mise à jour à des lignes spécifiques, si nécessaire.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!