Maison >base de données >tutoriel mysql >Pourquoi ma requête Oracle UPDATE avec un JOIN se bloque-t-elle et comment puis-je y remédier ?

Pourquoi ma requête Oracle UPDATE avec un JOIN se bloque-t-elle et comment puis-je y remédier ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-31 15:30:11726parcourir

Why Does My Oracle UPDATE Query with a JOIN Hang, and How Can I Fix It?

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!

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