Maison >base de données >tutoriel mysql >Comment éviter les boucles infinies lors de l'utilisation de sous-requêtes corrélées pour les instructions UPDATE dans Oracle ?
Mise à jour avec requête de jointure dans Oracle : gestion des mises à jour corrélées
Dans Oracle, l'exécution d'une requête de mise à jour avec une sous-requête corrélée peut entraîner un comportement inattendu ou des erreurs si la sous-requête ne renvoie pas une seule ligne. Considérez la requête 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);
Problème :
La requête fournie s'exécute indéfiniment car la sous-requête peut renvoyer plusieurs lignes pour chaque ligne de la table1. Dans ce scénario, Oracle tente de mettre à jour chaque ligne de la table1 plusieurs fois, ce qui entraîne une boucle sans fin.
Résolution :
Pour résoudre ce problème, il est nécessaire de assurez-vous que la sous-requête renvoie une seule ligne pour chaque ligne de la table1 en cours de mise à jour. Une approche consiste à ajouter une condition qui relie les lignes de la table1 aux lignes de la sous-requête :
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);
Dans cette requête modifiée, la condition supplémentaire, t1.some_key = t2.some_key, garantit que seules les lignes correspondantes sont inclus dans la sous-requête, ce qui donne une seule ligne pour chaque ligne de la table1.
De plus, il convient de se demander si la requête a l'intention de mettre à jour toutes les lignes dans le tableau 1 ou seulement un sous-ensemble d'entre eux. Si l'objectif est de mettre à jour uniquement des lignes spécifiques en fonction des résultats de la sous-requête, des critères de filtrage supplémentaires peuvent être ajoutés à la clause UPDATE.
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!