risposta-alla-domanda-sullo-sviluppo-web-bd.com

Aggiornamento SQL da una tabella a un'altra in base a una corrispondenza ID

Ho un database con account numbers e card numbers. Associando questi a un file a update qualsiasi numero di carta al numero di conto, in modo che io stia lavorando solo con i numeri di conto. 

Ho creato una vista che collega la tabella al database account/carta per restituire Table ID e il numero di account correlato, e ora ho bisogno di aggiornare quei record in cui l'ID corrisponde al numero di conto.

Questa è la tabella Sales_Import, in cui il campo account number deve essere aggiornato:

LeadID  AccountNumber
147         5807811235
150         5807811326
185         7006100100007267039

E questa è la tabella RetrieveAccountNumber, dove devo aggiornare da:

LeadID  AccountNumber
147         7006100100007266957
150         7006100100007267039

Ho provato il sotto, ma senza fortuna finora:

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

Aggiorna i numeri delle carte ai numeri di account, ma i numeri di account vengono sostituiti da NULL

803
Boerseun

Credo che un UPDATE FROM con un JOIN aiuterà:

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 e MariaDB

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

Il modo semplice per copiare il contenuto da una tabella ad un'altra è il seguente:

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

È inoltre possibile aggiungere la condizione per copiare i dati specifici.

269
Shivkant

Per SQL Server 2008 + l'uso di MERGE piuttosto che la sintassi proprietaria UPDATE ... FROM ha un certo fascino. 

Oltre ad essere SQL standard e quindi più portabile, genera anche un errore nel caso in cui vi siano più righe congiunte sul lato sorgente (e quindi più valori possibili diversi da utilizzare nell'aggiornamento) piuttosto che avere il risultato finale indeterminato .

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

Sfortunatamente la scelta di quale usare non può discendere puramente allo stile preferito comunque. L'implementazione di MERGE in SQL Server è stata afflitta da vari bug. Aaron Bertrand ha compilato un elenco di quelli riportati qui .

150
Martin Smith

Risposta generica per i futuri sviluppatori. 

Server SQL

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

Oracle (e 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;
60
Tigerjz32

Sembra che tu stia usando MSSQL, quindi, se ricordo bene, è fatto in questo modo:

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

Ho avuto lo stesso problema con foo.new impostato su null per le righe di foo che non avevano la chiave corrispondente in bar. Ho fatto qualcosa di simile in Oracle:

 update foo 
 set foo.new = (seleziona bar.new 
 dalla barra 
 dove foo.key = bar.key) 
 dove esiste (seleziona 1 
 dalla barra 
 dove foo.key = bar.key) 
29
Kjell Andreassen

Per PostgreSQL:

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

Per MySql funziona bene:

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

Grazie per le risposte. Ho trovato una soluzione.

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)  
14
Boerseun

Ecco cosa ha funzionato per me in SQL Server:

UPDATE [AspNetUsers] SET

[AspNetUsers].[OrganizationId] = [UserProfile].[OrganizationId],
[AspNetUsers].[Name] = [UserProfile].[Name]

FROM [AspNetUsers], [UserProfile]
WHERE [AspNetUsers].[Id] = [UserProfile].[Id];
11
Abhimanyu

Utilizzare il seguente blocco di query per aggiornare Table1 con Table2 in base all'ID:

UPDATE Sales_Import, RetrieveAccountNumber 
SET Sales_Import.AccountNumber = RetrieveAccountNumber.AccountNumber 
where Sales_Import.LeadID = RetrieveAccountNumber.LeadID;

Questo è il modo più semplice per affrontare questo problema.

3
Gil Baggio

Il seguente SQL suggerito da qualcuno, NON funziona in SQL Server. Questa sintassi mi ricorda la mia classe di vecchia scuola:

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

Tutte le altre query che utilizzano NOT IN o NOT EXISTS non sono raccomandate. I NULL vengono visualizzati perché OP confronta l'intero set di dati con un sottoinsieme più piccolo, quindi ovviamente ci sarà un problema di corrispondenza. Questo problema deve essere risolto scrivendo SQL corretto con JOIN corretta invece di risolvere il problema usando NOT IN. In questo caso potresti incontrare altri problemi usando NOT IN o NOT EXISTS.

Il mio voto per quello superiore, che è un modo convenzionale di aggiornare una tabella basata su un'altra tabella unendovi in ​​SQL Server. Come ho già detto, non è possibile utilizzare due tabelle nella stessa istruzione UPDATE in SQL Server a meno che non ci si colleghi prima.

3
Dr Inner Join

aggiornamento all'interno della stessa tabella:

  DECLARE @TB1 TABLE
    (
        No Int
        ,Name NVarchar(50)
        ,linkNo int
    )

    DECLARE @TB2 TABLE
    (
        No Int
        ,Name NVarchar(50)
        ,linkNo int
    )

    INSERT INTO @TB1 VALUES(1,'changed person data',  0);
    INSERT INTO @TB1 VALUES(2,'old linked data of person', 1);

INSERT INTO @TB2 SELECT * FROM @TB1 WHERE linkNo = 0


SELECT * FROM @TB1
SELECT * FROM @TB2


    UPDATE @TB1 
        SET Name = T2.Name
    FROM        @TB1 T1
    INNER JOIN  @TB2 T2 ON T2.No = T1.linkNo

    SELECT * FROM @TB1
3
NCP

funziona con postgresql

UPDATE application
SET omts_received_date = (
    SELECT
        date_created
    FROM
        application_history
    WHERE
        application.id = application_history.application_id
    AND application_history.application_status_id = 8
);
2
jakentus

MS Sql

UPDATE  c4 SET Price=cp.Price*p.FactorRate FROM TableNamea_A c4
inner join TableNamea_B p on c4.Calcid=p.calcid 
inner join TableNamea_A cp on c4.Calcid=cp.calcid 
WHERE c4..Name='MyName';

Oracle 11g

        MERGE INTO  TableNamea_A u 
        using
        (
                SELECT c4.TableName_A_ID,(cp.Price*p.FactorRate) as CalcTot 
                FROM TableNamea_A c4
                inner join TableNamea_B p on c4.Calcid=p.calcid 
                inner join TableNamea_A cp on c4.Calcid=cp.calcid 
                WHERE p.Name='MyName' 
        )  rt
        on (u.TableNamea_A_ID=rt.TableNamea_B_ID)
        WHEN MATCHED THEN
        Update set Price=CalcTot  ;
1
saman samadi

Ho pensato che questo è un semplice esempio potrebbe qualcuno ottenere più facile, 

        DECLARE @TB1 TABLE
        (
            No Int
            ,Name NVarchar(50)
        )

        DECLARE @TB2 TABLE
        (
            No Int
            ,Name NVarchar(50)
        )

        INSERT INTO @TB1 VALUES(1,'asdf');
        INSERT INTO @TB1 VALUES(2,'awerq');


        INSERT INTO @TB2 VALUES(1,';oiup');
        INSERT INTO @TB2 VALUES(2,'lkjhj');

        SELECT * FROM @TB1

        UPDATE @TB1 SET Name =S.Name
        FROM @TB1 T
        INNER JOIN @TB2 S
                ON S.No = T.No

        SELECT * FROM @TB1
1
user824910

Nel caso in cui le tabelle siano in database diversi. (Server SQL)

update database1..Ciudad
set CiudadDistrito=c2.CiudadDistrito

FROM database1..Ciudad c1
 inner join 
  database2..Ciudad c2 on c2.CiudadID=c1.CiudadID
0
Maurico Bello

Oracle 11g

merge into Sales_Import
using RetrieveAccountNumber
on (Sales_Import.LeadId = RetrieveAccountNumber.LeadId)
when matched then update set Sales_Import.AccountNumber = RetrieveAccountNumber.AccountNumber;
0
Bruno