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 exécuter une requête de mise à jour SQL qui peut mettre à jour le tableau 1 avec le tableau 2 name
et en desc
utilisant le même id
? Donc, le résultat final que j'obtiendrais est
Tableau 1:
id name desc
-----------------------
1 x 123
2 y 345
3 c adf
La question provient de la mise à jour d'une table avec les données d'une autre , mais spécifiquement pour Oracle SQL.
sql
oracle
sql-update
Muhd
la source
la source
Réponses:
C'est ce qu'on appelle une mise à jour corrélée
En supposant que les résultats de la jointure dans une vue préservée par clé, vous pouvez également
la source
WHERE EXISTS
vous empêche de mettre à jour une ligne danst1
s'il n'y a pas de ligne correspondantet2
. Sans cela, chaque lignet1
sera mise à jour et les valeurs seront définiesNULL
s'il n'y a pas de ligne correspondantet2
. Ce n'est généralement pas ce que vous voulez, doncWHERE EXISTS
c'est généralement nécessaire.SELECT ... FROM t2
doit être unique. Cela signifie que vous devez sélectionner tous les champs qui composent une clé unique - une clé primaire non unique n'est pas suffisante. Sans unicité, vous êtes réduit à quelque chose comme la boucle de @ PaulKarr - et s'il n'y a pas de corrélation unique, alors plus d'une ligne cible peut être mise à jour pour chaque ligne source.table2
) renvoie plusieurs lignes pour une ou plusieurstable1
valeurs et Oracle ne sait pas laquelle vous souhaitez utiliser. Normalement, cela signifie que vous devez affiner la sous-requête afin qu'elle renvoie une seule ligne distincte.Essaye ça:
la source
table1
ettable2
sont la même table, il suffit de prendre soin deON
-part et de laWHERE
clause-pour laSELECT
déclaration detable2
!essayer
la source
n'a jamais fonctionné pour moi car l'ensemble n'attend qu'une valeur - Erreur SQL: ORA-01427: la sous-requête à une seule ligne renvoie plus d'une ligne.
voici la solution:
C'est exactement comme cela que vous l'exécutez sur la feuille de calcul SQLDeveloper. Ils disent que c'est lent mais c'est la seule solution qui a fonctionné pour moi dans ce cas.
la source
Voici une réponse encore meilleure avec la clause 'in' qui autorise plusieurs clés pour la jointure :
Le bœuf est d'avoir les colonnes que vous souhaitez utiliser comme clé entre parenthèses dans la clause where avant "in" et d'avoir l'instruction select avec les mêmes noms de colonne entre parenthèses. où ( colonne1, colonne2 ) dans ( sélectionnez ( colonne1, colonne2 ) dans le tableau où "l'ensemble que je veux" );
la source
404
)Si votre table t1 et sa sauvegarde t2 ont plusieurs colonnes, voici une façon compacte de le faire.
En outre, mon problème connexe était que seules certaines des colonnes ont été modifiées et que de nombreuses lignes n'ont pas été modifiées dans ces colonnes, je voulais donc les laisser tranquilles - restaurer essentiellement un sous-ensemble de colonnes à partir d'une sauvegarde de la table entière. Si vous souhaitez simplement restaurer toutes les lignes, ignorez la clause where.
Bien sûr, la manière la plus simple serait de supprimer et d'insérer comme sélectionner, mais dans mon cas, j'avais besoin d'une solution avec juste des mises à jour.
L'astuce est que lorsque vous sélectionnez * à partir d'une paire de tables avec des noms de colonne en double, la 2ème sera nommée _1. Voici donc ce que j'ai trouvé:
la source
la source