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
615 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!

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