J'ai une base de données avec account numbers
et card numbers
. Je les associe à un fichier à update
n'importe quel numéro de carte au numéro de compte, de sorte que je ne travaille qu'avec des numéros de compte.
J'ai créé une vue reliant la table à la base de données de compte / carte pour renvoyer le Table ID
et le numéro de compte associé, et maintenant je dois mettre à jour les enregistrements où l'ID correspond au numéro de compte.
Voici le Sales_Import
tableau, où le account number
champ doit être mis à jour:
LeadID AccountNumber
147 5807811235
150 5807811326
185 7006100100007267039
Et voici le RetrieveAccountNumber
tableau, où je dois mettre à jour à partir de:
LeadID AccountNumber
147 7006100100007266957
150 7006100100007267039
J'ai essayé ci-dessous, mais pas de chance jusqu'à présent:
UPDATE [Sales_Lead].[dbo].[Sales_Import]
SET [AccountNumber] = (SELECT RetrieveAccountNumber.AccountNumber
FROM RetrieveAccountNumber
WHERE [Sales_Lead].[dbo].[Sales_Import]. LeadID =
RetrieveAccountNumber.LeadID)
Il met à jour les numéros de carte en numéros de compte, mais les numéros de compte sont remplacés par NULL
la source
SI.AccountNumber
àAccountNumber
sinon il échouera.UPDATE Sales_Import, RetrieveAccountNumber SET Sales_Import.AccountNumber = RetrieveAccountNumber.AccountNumber where Sales_Import.LeadID = RetrieveAccountNumber.LeadID;
. Légèrement hors sujet mais peut être utileLa manière simple de copier le contenu d'une table à une autre est la suivante:
Vous pouvez également ajouter la condition pour copier les données particulières.
la source
Pour SQL Server 2008 + L'utilisation
MERGE
plutôt que laUPDATE ... FROM
syntaxe propriétaire a un certain attrait.En plus d'être un SQL standard et donc plus portable, il soulèvera également une erreur en cas de plusieurs lignes jointes du côté source (et donc plusieurs valeurs différentes possibles à utiliser dans la mise à jour) plutôt que d'avoir le résultat final indéterministe .
Malheureusement, le choix de celui à utiliser peut ne pas se résumer uniquement au style préféré. L'implémentation de
MERGE
dans SQL Server a été affectée par divers bogues. Aaron Bertrand a compilé une liste de ceux rapportés ici .la source
MERGE
.Réponse générique pour les futurs développeurs.
serveur SQL
Oracle (et SQL Server)
MySQL
la source
update t1...
plutôt queupdate Table1...
)Pour PostgreSQL:
la source
Semble que vous utilisez MSSQL, alors, si je me souviens bien, cela se fait comme ceci:
la source
J'ai eu le même problème avec la
foo.new
définition denull
lignesfoo
qui n'avaient pas de clé correspondantebar
. J'ai fait quelque chose comme ça dans Oracle:la source
Pour MySql qui fonctionne bien:
la source
Voici ce qui a fonctionné pour moi dans SQL Server:
la source
Merci pour les réponses. J'ai trouvé une solution.
la source
Dans le cas où les tables se trouvent dans des bases de données différentes. (MSSQL)
la source
Utilisez le bloc de requête suivant pour mettre à jour Table1 avec Table2 en fonction de l'ID:
C'est le moyen le plus simple de résoudre ce problème.
la source
MS Sql
Oracle 11g
la source
mise à jour dans le même tableau:
la source
Le SQL ci-dessous suggéré par quelqu'un, ne fonctionne PAS dans SQL Server. Cette syntaxe me rappelle ma classe de vieille école:
Toutes les autres requêtes utilisant
NOT IN
ouNOT EXISTS
ne sont pas recommandées. Les valeurs NULL apparaissent car OP compare l'ensemble de données complet avec un sous-ensemble plus petit, alors bien sûr il y aura un problème de correspondance. Cela doit être corrigé en écrivant le bon SQL avec correctJOIN
au lieu d'esquiver le problème en utilisantNOT IN
. Vous pourriez rencontrer d'autres problèmes en utilisantNOT IN
ouNOT EXISTS
dans ce cas.Mon vote pour celui du haut, qui est une manière conventionnelle de mettre à jour une table basée sur une autre table en se joignant à SQL Server. Comme je l'ai dit, vous ne pouvez pas utiliser deux tables dans la même
UPDATE
instruction dans SQL Server, sauf si vous les joignez d'abord.la source
cela fonctionne avec postgresql
la source
Je pensais que c'était un exemple simple si quelqu'un pouvait le faire plus facilement,
la source
Oracle 11g
la source
Cela vous permettra de mettre à jour une table en fonction de la valeur de colonne introuvable dans une autre table.
Cela mettra à jour une table en fonction de la valeur de colonne trouvée dans les deux tables.
la source
essaye ça :
la source
Je voudrais ajouter une chose supplémentaire.
Ne mettez pas à jour une valeur avec la même valeur, cela génère une journalisation supplémentaire et une surcharge inutile. Voir l'exemple ci-dessous - il effectuera uniquement la mise à jour sur 2 enregistrements malgré la liaison sur 3.
la source
Si les réponses ci-dessus ne fonctionnent pas pour vous, essayez ceci
la source