Oracle SQL: mettre à Jour une table avec des données provenant d'une autre table
Tableau 1:
id name desc
-----------------------
1 a abc
2 b def
3 c adf
Tableau 2:
id name desc
-----------------------
1 x 123
2 y 345
Dans oracle SQL, comment puis-je exécuter une sql de mise à jour requête qui peut mettre à jour le Tableau 1 au Tableau 2 de l' name
et desc
à l'aide de la même id
? Donc au final, le résultat que j'obtiendrais est
Tableau 1:
id name desc
-----------------------
1 x 123
2 y 345
3 c adf
Question est prise à partir de mise à jour d'une table avec des données à partir d'un autre, mais spécifiquement pour oracle SQL.
- double possible de sql de la requête de mise à jour avec les données d'une autre table
- Vous avez besoin de revenir à votre question, l'onu accepte cette réponse, et de préciser que vous avez besoin de l'Oracle PLSQL syntaxe.
- Ce n'est pas ma question...
- Oh, je vois. Si vous copie-collé de la question du corps, mais modifié pour inclure l'Oracle bits.
- Ouais. Et ce n'est probablement pas le meilleur exemple, puisque "desc" est un mot réservé, mais bon.
Vous devez vous connecter pour publier un commentaire.
Cela s'appelle une corrélation mise à jour
En supposant que la jointure des résultats dans un préservé vue, vous pouvez également
WHERE EXISTS
vous empêche de mettre à jour une ligne danst1
si il n'y a pas de ligne correspondante danst2
. Sans elle, chaque ligne det1
sera mis à jour et les valeurs seront mis àNULL
si il n'y a pas de ligne correspondante danst2
. Qui n'est généralement pas ce que vous voulez arriver si l'WHERE EXISTS
est généralement nécessaire.SELECT ... FROM t2
doit résultat dans une ligne unique. Cela signifie que vous devez sélectionner tous les champs qui composent une clé unique -- non unique de la clé primaire n'est pas suffisant. Sans unicité, vous êtes réduit à quelque chose comme @PaulKarr de la boucle - et si il n'y a pas unicité de la corrélation, puis plus d'une ligne cible peut être mis à jour pour chaque ligne source.IN
ouEXISTS
. Si il y a une différence, si vous vous attendez à ce que la ligne de requête est généralement va retourner une relativement grande partie des lignes dans la table cible, uneEXISTS
serait généralement plus efficace, uneIN
seraient plus efficaces si vous comptez revenir qu'une infime fraction des lignes dans la table cible. Bien sûr, les "petits" et "grands" sont des termes relatifs, de sorte que la seule vraie réponse est de tester et de voir.table2
) est renvoyant plusieurs lignes pour un ou plusieurstable1
des valeurs et de l'Oracle ne sais pas ce que vous voulez utiliser. Normalement, cela signifie que vous avez besoin pour affiner la sous-requête afin qu'elle retourne une seule ligne distinct.MERGE
de commande spécialement pour celaEssayez ceci:
table1
ettable2
sont de la même table, il suffit de prendre soin de laON
-partie et leWHERE
de la clause de laSELECT
-déclaration detable2
!essayer
Ici semble être une meilleure réponse avec "dans" la clause qui autorise plusieurs clés pour la rejoindre:
L'exemple complet est ici:
http://forums.devshed.com/oracle-development-96/how-to-update-from-two-tables-195893.html
La viande de boeuf est en ayant les colonnes que vous souhaitez utiliser comme clé entre parenthèses dans la clause where avant d'en avoir l'instruction select avec les mêmes noms de colonnes dans les parenthèses.
où (column1,column2) dans ( sélectionnez (column1,column2) à partir de la table où les "le je veux" );
n'a jamais travaillé pour moi depuis le set s'attend seulement 1 valeur SQL Error: ORA-01427: simple-rangée sous-requête renvoie plusieurs lignes.
voici la solution:
C'est exactement comment vous l'exécutez sur SQLDeveloper feuille de calcul. Ils disent que c'est lent mais c'est la seule solution qui a fonctionné pour moi sur cette affaire.
Si votre table t1 et c'est la sauvegarde de t2 ont beaucoup de colonnes, voici un compact moyen de le faire.
En outre, mon problème connexe est que seulement certaines colonnes ont été modifiés et le nombre de lignes n'avait pas de modifications de ces colonnes, j'ai donc voulu donner à ces seuls - essentiellement de la restauration d'un sous-ensemble de colonnes à partir d'une sauvegarde de l'ensemble de la table. Si vous voulez il suffit de restaurer toutes les lignes, sauter la clause where.
Bien sûr, le plus simple serait de supprimer et insérer des select, mais dans mon cas, j'ai besoin d'une solution avec juste les mises à jour.
Le truc, c'est que lorsque vous sélectionnez * à partir d'une paire de tables avec des noms de colonne en double, le 2ème sera nommé _1. Alors, voici ce que je suis venu avec: