Maison > base de données > tutoriel mysql > Comment mettre à jour correctement les tables avec des jointures internes dans Oracle pour éviter ORA-00933 ?

Comment mettre à jour correctement les tables avec des jointures internes dans Oracle pour éviter ORA-00933 ?

Barbara Streisand
Libérer: 2025-01-25 04:51:09
original
872 Les gens l'ont consulté

How to Correctly Update Tables with Inner Joins in Oracle to Avoid ORA-00933?

MISE À JOUR d'Oracle avec INNER JOIN : éviter ORA-00933

Lors de la mise à jour des tables Oracle à l'aide d'une jointure interne, une erreur courante est ORA-00933 : "La commande SQL n'est pas correctement terminée." Cela résulte de l'utilisation d'une syntaxe incorrecte. La syntaxe standard UPDATE ... INNER JOIN ... SET ... utilisée dans d'autres bases de données comme MySQL ne fonctionne pas directement dans Oracle.

Le problème et la solution d'Oracle

La syntaxe problématique ressemble à ceci :

<code class="language-sql">UPDATE table1
INNER JOIN table2 ON table1.value = table2.DESC
SET table1.value = table2.CODE
WHERE table1.UPDATETYPE='blah';</code>
Copier après la connexion

Oracle nécessite une approche différente. Voici la bonne méthode :

<code class="language-sql">UPDATE table1 SET table1.value = (SELECT table2.CODE
                                  FROM table2 
                                  WHERE table1.value = table2.DESC)
WHERE table1.UPDATETYPE='blah'
AND EXISTS (SELECT table2.CODE
            FROM table2 
            WHERE table1.value = table2.DESC);</code>
Copier après la connexion

Cela utilise une sous-requête pour récupérer la valeur table2.CODE pour la mise à jour et une clause EXISTS pour garantir que la mise à jour n'a lieu que lorsqu'une ligne correspondante existe dans table2. Cela évite les erreurs causées par une tentative de mise à jour avec des valeurs inexistantes.

Une méthode alternative : les vues en ligne

Une autre option consiste à utiliser une vue en ligne :

<code class="language-sql">UPDATE 
(SELECT table1.value as OLD, table2.CODE as NEW
 FROM table1
 INNER JOIN table2
 ON table1.value = table2.DESC
 WHERE table1.UPDATETYPE='blah'
) t
SET t.OLD = t.NEW;</code>
Copier après la connexion

Le succès de cette méthode dépend du fait qu'Oracle considère ou non la vue en ligne comme pouvant être mise à jour, ce qui est régi par des règles de base de données spécifiques. La méthode précédente est généralement plus fiable. Choisissez la méthode qui correspond le mieux à vos besoins et testez toujours minutieusement.

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