Maison > base de données > tutoriel mysql > Comment mettre à jour correctement une colonne de table à l'aide d'un JOIN dans Oracle SQL ?

Comment mettre à jour correctement une colonne de table à l'aide d'un JOIN dans Oracle SQL ?

Susan Sarandon
Libérer: 2024-12-22 13:48:10
original
409 Les gens l'ont consulté

How to Correctly Update a Table Column Using a JOIN in Oracle SQL?

Requête de mise à jour Oracle à l'aide de JOIN

Lors d'une tentative de mise à jour d'une colonne à l'aide d'une opération JOIN, une exception est rencontrée : ORA-00933 : la commande SQL ne s'est pas correctement terminée. La requête suivante illustre le problème :

UPDATE tab1
   SET tab1.total_adjusted_cost = tab1.total_adjusted_cost + t1.total
 FROM table1 tab1, 
      (SELECT tab3.name, tab3.add, SUM(tab2.amount) AS total
         FROM table2 tab2,
              table3 tab3,
              table4 tab4
        WHERE tab2.id = tab3.id
          AND tab3.id = tab4.id
          AND tab4.indicator = 'Y'
        GROUP BY tab3.name, tab3.add ) t1
WHERE tab1.id = t1.id;
Copier après la connexion

Solution

Pour résoudre l'erreur, la requête doit utiliser une instruction MERGE au lieu d'une UPDATE avec une sous-requête. L'instruction MERGE permet à la fois une opération de mise à jour et une opération d'insertion dans une seule instruction. La requête corrigée utilisant MERGE est :

merge into table1 tab1 
using
(
SELECT tab3.name, tab3."add", SUM(tab2.amount) AS total
  FROM table2 tab2,
    table3 tab3 ,
    table4 tab4
  WHERE tab2.id        = tab3.id
  AND tab3.id            = tab4.id
  AND tab4.indicator             ='Y'
  GROUP BY tab3.name,
    tab3."add"
)t1
on(tab1.id      = t1.id)
when matched then 
update set tab1.total_adjusted_cost = tab1.total_adjusted_cost + t1.total
Copier après la connexion

Cette instruction MERGE évalue les lignes de la table1 et la sous-requête t1 sur la condition de jointure tab1.id = t1.id. Lorsqu'une correspondance est trouvée, elle met à jour la colonne total_adjusted_cost dans la table1 en ajoutant la valeur totale de la sous-requête.

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