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
Libérer: 2024-12-29 02:24:11
original
591 Les gens l'ont consulté

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);
Copier après la connexion

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);
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal