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 ?

Comment éviter les boucles infinies lors de l'utilisation de sous-requêtes corrélées pour les instructions UPDATE dans Oracle ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-29 02:24:11579parcourir

How to Avoid Infinite Loops When Using Correlated Subqueries for UPDATE Statements in 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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn