J'ai une requête qui fonctionne bien dans MySQL, mais lorsque je l'exécute sur Oracle, j'obtiens l'erreur suivante:
Erreur SQL: ORA-00933: commande SQL non terminée correctement
00933. 00000 - "Commande SQL non terminée correctement"
La requête est:
UPDATE table1
INNER JOIN table2 ON table1.value = table2.DESC
SET table1.value = table2.CODE
WHERE table1.UPDATETYPE='blah';
sql
oracle
inner-join
ora-00933
user169743
la source
la source
Réponses:
Cette syntaxe n'est pas valide dans Oracle. Tu peux le faire:
Ou vous pourriez être en mesure de le faire:
Cela dépend si la vue en ligne est considérée comme pouvant être mise à jour par Oracle (La mise à jour pour la deuxième instruction dépend de certaines règles répertoriées ici ).
la source
Utilisez ceci:
la source
merge into table 1 t
et ainsi de suite.ON
,trg
est l'alias de la table principale (tabletable1
"externe" par votre logique) et faitsrc
référence auUSING
groupe ("table interne" par votre logique). Mais oui, j'aurais probablement pu être mieux référencé, mais j'ai pu le suivre.MERGE
avecWHERE
clause:Vous avez besoin de la
WHERE
clause car les colonnes référencées dans laON
clause ne peuvent pas être mises à jour.la source
la source
N'utilisez pas certaines des réponses ci-dessus.
Certains suggèrent l'utilisation de SELECT imbriqué, ne le faites pas, c'est extrêmement lent. Si vous avez beaucoup d'enregistrements à mettre à jour, utilisez join, donc quelque chose comme:
Voir ce lien pour plus de détails. http://geekswithblogs.net/WillSmith/archive/2008/06/18/oracle-update-with-join-again.aspx .
Assurez-vous également qu'il existe des clés primaires sur toutes les tables que vous joignez.
la source
Comme indiqué ici , la syntaxe générale de la première solution proposée par Tony Andrews est:
Je pense que c'est intéressant surtout si vous voulez mettre à jour plus d'un champ.
la source
Cette syntaxe suivante fonctionne pour moi.
la source
SET
faisait unREPLACE
et j'essayais de vider une chaîne particulière dans la colonne - se révèle Oracle traite''
comme nul, et ce champ n'a pas pu être annulé. Je pensais que la syntaxe mettait simplement à jour une table temporaire au lieu de la vraie, mais je me trompais.En utilisant description au lieu de desc pour table2,
la source
Cela fonctionne bien oracle
la source
t1.First_Name = t2.FirstName, t1.Last_Name = t2.LastName
sur une table après l'avoir fait correspondre dans la colonne "UserName" (t1.UserName = t2.UserName
) pour récupérer leur nom dans une table appelée UserInfo (select * from UserInfo) t2
). La base de données était telle qu'elle utilisait UserName comme clé primaire pour UserInfo partout, au lieu de placer FirstName et LastName dans la table, directement. Cela a corrigé cela!la source
la source
Par souci d'exhaustivité, et parce que nous parlons d'Oracle, cela pourrait également le faire:
la source
A et B sont des champs d'alias, vous n'avez pas besoin de pointer la table.
la source
la source