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