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
Credo che un UPDATE FROM
con un JOIN
aiuterà:
UPDATE
Sales_Import
SET
Sales_Import.AccountNumber = RAN.AccountNumber
FROM
Sales_Import SI
INNER JOIN
RetrieveAccountNumber RAN
ON
SI.LeadID = RAN.LeadID;
UPDATE
Sales_Import SI,
RetrieveAccountNumber RAN
SET
SI.AccountNumber = RAN.AccountNumber
WHERE
SI.LeadID = RAN.LeadID;
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.
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 .
Risposta generica per i futuri sviluppatori.
UPDATE
t1
SET
t1.column = t2.column
FROM
Table1 t1
INNER JOIN Table2 t2
ON t1.id = t2.id;
UPDATE
t1
SET
t1.colmun = t2.column
FROM
Table1 t1,
Table2 t2
WHERE
t1.ID = t2.ID;
UPDATE
Table1 t1,
Table2 t2
SET
t1.column = t2.column
WHERE
t1.ID = t2.ID;
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
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)
Per PostgreSQL:
UPDATE Sales_Import SI
SET AccountNumber = RAN.AccountNumber
FROM RetrieveAccountNumber RAN
WHERE RAN.LeadID = SI.LeadID;
Per MySql funziona bene:
UPDATE
Sales_Import SI,RetrieveAccountNumber RAN
SET
SI.AccountNumber = RAN.AccountNumber
WHERE
SI.LeadID = RAN.LeadID
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)
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];
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.
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.
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
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
);
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 ;
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
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
Oracle 11g
merge into Sales_Import
using RetrieveAccountNumber
on (Sales_Import.LeadId = RetrieveAccountNumber.LeadId)
when matched then update set Sales_Import.AccountNumber = RetrieveAccountNumber.AccountNumber;