Question Mise à jour SQL d'une table à une autre en fonction d'une correspondance d'ID


J'ai une base de données avec account numbers et card numbers. Je fais correspondre ceux-ci à un fichier update tous les numéros 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 compte / carte pour retourner le Table ID et le numéro de compte associé, et maintenant j'ai besoin de mettre à jour ces enregistrements où l'ID correspond au numéro de compte.

C'est le Sales_Import table, où le account number Le champ doit être mis à jour:

LeadID  AccountNumber
147         5807811235
150         5807811326
185         7006100100007267039

Et c'est le RetrieveAccountNumber tableau, où j'ai besoin de mettre à jour à partir de:

LeadID  AccountNumber
147         7006100100007266957
150         7006100100007267039

J'ai essayé le 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 aux numéros de compte, mais les numéros de compte sont remplacés par NULL


742
2017-10-22 07:14


origine


Réponses:


Je crois un UPDATE FROM avec un JOIN aidera:

MS SQL

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

MySQL et MariaDB

UPDATE
    Sales_Import SI,
    RetrieveAccountNumber RAN
SET
    SI.AccountNumber = RAN.AccountNumber
WHERE
    SI.LeadID = RAN.LeadID;

1116
2017-10-22 07:19



La façon simple de 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 la condition pour obtenir les données particulières copiées.


254
2018-01-20 12:26



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

En plus d'être un SQL standard et donc plus portable, il provoquera une erreur en cas de plusieurs lignes jointes 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'utilisation ne peut pas descendre purement à un style préféré cependant. L'implémentation de MERGE dans SQL Server a été affecté avec divers bogues. Aaron Bertrand a compilé une liste de les rapportés ici.


143
2018-02-11 15:13



Réponse générique pour les futurs développeurs.

serveur SQL

UPDATE 
     t1
SET 
     t1.column = t2.column
FROM 
     Table1 t1 
     INNER JOIN Table2 t2 
     ON t1.id = t2.id;

Oracle (et SQL Server)

UPDATE 
     t1
SET 
     t1.colmun = t2.column 
FROM 
     Table1 t1, 
     Table2 t2 
WHERE 
     t1.ID = t2.ID;

MySQL

UPDATE 
     Table1 t1, 
     Table2 t2
SET 
     t1.column = t2.column 
WHERE
     t1.ID = t2.ID;

39
2017-08-29 17:59



On dirait que vous utilisez MSSQL, alors, si je me souviens bien, c'est comme ça:

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

32
2017-10-22 07:21



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

mise à jour foo
set foo.new = (sélectionnez bar.new
                  de la barre
                  où foo.key = bar.key)
où existe (sélectionnez 1
              de la barre
              où foo.key = bar.key)

28
2018-04-29 18:32



Pour MySql:

UPDATE table1 JOIN table2 
ON table1.id = table2.id
SET table1.name = table2.name,
table1.`desc` = table2.`desc`

Pour Serveur SQL:

UPDATE table1
SET table1.name = table2.name,
table1.[desc] = table2.[desc]
FROM table1 JOIN table2 
ON table1.id = table2.id

J'ai utilisé toutes les requêtes ci-dessus, mais elles ne fonctionnent pas; et quand j'ai utilisé celui-ci, c'est fait.

Vous pouvez l'attraper d'ici aussi, https://stackoverflow.com/questions/5036918/update-one-table-with-data-from-another

J'espère que vous l'aurez compris. Merci


25
2018-03-29 07:14



Pour PostgreSQL:

UPDATE Sales_Import SI
SET AccountNumber = RAN.AccountNumber
FROM RetrieveAccountNumber RAN
WHERE RAN.LeadID = SI.LeadID; 

24
2017-07-16 19:55



Pour MySql cela fonctionne bien:

UPDATE
    Sales_Import SI,RetrieveAccountNumber RAN
SET
    SI.AccountNumber = RAN.AccountNumber
WHERE
    SI.LeadID = RAN.LeadID

23
2018-02-13 16:40



Merci pour les réponses. J'ai trouvé une solution.

UPDATE Sales_Import 
SET    AccountNumber = (SELECT RetrieveAccountNumber.AccountNumber 
                          FROM   RetrieveAccountNumber 
                          WHERE  Sales_Import.leadid =RetrieveAccountNumber.LeadID) 
WHERE Sales_Import.leadid = (SELECT  RetrieveAccountNumber.LeadID 
                             FROM   RetrieveAccountNumber 
                             WHERE  Sales_Import.leadid = RetrieveAccountNumber.LeadID)  

12
2017-10-22 08:07