1182 votes

Mise à jour SQL d'une table à une autre sur la base d'une correspondance d'ID

J'ai une base de données avec des numéros de compte et des numéros de carte. Je les fais correspondre à un fichier pour mettre à jour les numéros de carte en fonction du numéro de compte, afin de ne travailler qu'avec les numéros de compte.

J'ai créé une vue reliant la table à la base de données des comptes et des cartes pour renvoyer l'ID de la table et le numéro de compte correspondant. Je dois maintenant mettre à jour les enregistrements pour lesquels l'ID correspond au numéro de compte.

C'est le Sales_Import où le champ du numéro de compte doit être mis à jour :

LeadID  AccountNumber
147         5807811235
150         5807811326
185         7006100100007267039

Et c'est le RetrieveAccountNumber d'où je dois faire la mise à jour :

LeadID  AccountNumber
147         7006100100007266957
150         7006100100007267039

J'ai essayé ce qui suit, mais sans succès 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.

1666voto

Mark S. Rasmussen Points 13313

Je crois qu'un UPDATE FROM avec un JOIN vous aidera :

UPDATE
    Sales_Import
SET
    Sales_Import.AccountNumber = RAN.AccountNumber
FROM
    Sales_Import SI
INNER JOIN
    RetrieveAccountNumber RAN
ON 
    SI.LeadID = RAN.LeadID

341voto

Shivkant Points 1292

La méthode simple pour copier le contenu d'une table à l'autre est la suivante :

UPDATE table2 
SET table2.col1 = table1.col1, 
table2.col2 = table1.col2,
...
FROM table1, table2 
WHERE table1.memberid = table2.memberid

Vous pouvez également ajouter une condition pour que les données particulières soient copiées.

170voto

Martin Smith Points 174101

Pour SQL Server 2008 + Utilisation MERGE plutôt que le système propriétaire UPDATE ... FROM la syntaxe a un certain attrait.

Outre le fait qu'il s'agit d'un langage SQL standard et qu'il est donc plus portable, il lèvera également une erreur dans le cas où il y aurait plusieurs lignes jointes du côté source (et donc plusieurs valeurs différentes possibles à utiliser dans la mise à jour) plutôt que d'avoir un résultat final indéterminé.

MERGE INTO Sales_Import
   USING RetrieveAccountNumber
      ON Sales_Import.LeadID = RetrieveAccountNumber.LeadID
WHEN MATCHED THEN
   UPDATE 
      SET AccountNumber = RetrieveAccountNumber.AccountNumber;

Malheureusement, le choix de l'un ou l'autre ne se résume pas à une question de style. L'implémentation de MERGE dans SQL Server a été affligé de divers bogues. Aaron Bertrand a compilé une liste de ceux qui ont été signalés ici .

40voto

Vinko Vrsalovic Points 116138

Si vous utilisez MSSQL, alors, si je me souviens bien, cela se fait de la manière suivante :

UPDATE [Sales_Lead].[dbo].[Sales_Import] SET [AccountNumber] = 
RetrieveAccountNumber.AccountNumber 
FROM RetrieveAccountNumber 
WHERE [Sales_Lead].[dbo].[Sales_Import].LeadID = RetrieveAccountNumber.LeadID

37voto

Kjell Andreassen Points 415

J'ai eu le même problème avec foo.new étant réglé sur null pour les rangs de foo qui n'avait pas de clé correspondante dans bar . J'ai fait quelque chose comme ça dans Oracle :

update foo
set    foo.new = (select bar.new
                  from bar 
                  where foo.key = bar.key)
where exists (select 1
              from bar
              where foo.key = bar.key)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X