Am o baza de date cu numerele de cont " și " numere de card`. Nu se potrivesc acestea la un fișier la "actualizare" orice numere de card de la numărul de cont, așa că eu sunt doar de lucru cu numerele de cont.
Am creat o vedere care leagă masa de cont/card de date pentru a reveni la Masa de IDENTITATE și cele legate de numărul de cont, și acum am nevoie pentru a actualiza înregistrările pentru care ID-ul se potrivește cu Numărul de Cont.
Aceasta este `Sales_Import masă, în cazul în care contul număr teren trebuie să fie actualizat:
LeadID AccountNumber
147 5807811235
150 5807811326
185 7006100100007267039
Și aceasta este `RetrieveAccountNumber masă, în cazul în care am nevoie pentru a actualiza din:
LeadID AccountNumber
147 7006100100007266957
150 7006100100007267039
Am încercat de mai jos, dar nici un noroc până acum:
UPDATE [Sales_Lead].[dbo].[Sales_Import]
SET [AccountNumber] = (SELECT RetrieveAccountNumber.AccountNumber
FROM RetrieveAccountNumber
WHERE [Sales_Lead].[dbo].[Sales_Import]. LeadID =
RetrieveAccountNumber.LeadID)
Aceasta actualizează numere de card de la numere de cont, dar numerele de cont se înlocuiește cu NULL
Cred ca un UPDATE DE la "cu un" ALĂTURĂ-te va ajuta:
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;
Simplu Mod de a copia conținutul de la o masa la alta este după cum urmează:
UPDATE table2
SET table2.col1 = table1.col1,
table2.col2 = table1.col2,
...
FROM table1, table2
WHERE table1.memberid = table2.memberid
Puteți adăuga, de asemenea, starea de a obține anumite date copiate.
Pentru SQL Server 2008 + Folosind MERGE
, mai degrabă decât de proprietate UPDATE ... DIN
sintaxa are unele recurs.
Precum și ca fiind standard SQL și, astfel, mai portabil, de asemenea, va ridica o eroare în caz de acolo fiind mai multe rânduri s-au alăturat pe sursa parte (și, astfel, mai multe posibile valori diferite de a utiliza în actualizare), mai degrabă decât rezultatul final să fie undeterministic.
MERGE INTO Sales_Import
USING RetrieveAccountNumber
ON Sales_Import.LeadID = RetrieveAccountNumber.LeadID
WHEN MATCHED THEN
UPDATE
SET AccountNumber = RetrieveAccountNumber.AccountNumber;
Din păcate, alegerea de care să se folosească nu poate veni în jos pur stil preferat cu toate acestea. Punerea în aplicare a MERGE
în SQL Server a fost afectat de diverse bug-uri. Aaron Bertrand a întocmit o listă de cele raportate aici.
Generic răspunsul pentru viitor dezvoltatorii.
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;
Se pare că sunteți folosind MSSQL, atunci, dacă îmi amintesc corect, se face astfel:
UPDATE [Sales_Lead].[dbo].[Sales_Import] SET [AccountNumber] =
RetrieveAccountNumber.AccountNumber
FROM RetrieveAccountNumber
WHERE [Sales_Lead].[dbo].[Sales_Import].LeadID = RetrieveAccountNumber.LeadID
Am avut aceeași problemă cu
update foo set foo.nou = (select bar.noi de la bar în cazul în care foo.cheie = bar.cheie) în cazul în care există (selectați 1 de la bar în cazul în care foo.cheie = bar.cheie)
Aici's ceea ce a lucrat pentru mine în SQL Server:
UPDATE [AspNetUsers] SET
[AspNetUsers].[OrganizationId] = [UserProfile].[OrganizationId],
[AspNetUsers].[Name] = [UserProfile].[Name]
FROM [AspNetUsers], [UserProfile]
WHERE [AspNetUsers].[Id] = [UserProfile].[Id];
Multumesc pentru raspunsuri. Am găsit o soluție tho.
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)
Utilizați următoarele bloc de interogare pentru a actualiza Tabelul 1 cu Tabelul 2 bazează pe ID-ul:
UPDATE Sales_Import, RetrieveAccountNumber
SET Sales_Import.AccountNumber = RetrieveAccountNumber.AccountNumber
where Sales_Import.LeadID = RetrieveAccountNumber.LeadID;
Acest lucru este cel mai simplu mod pentru a aborda această problemă.
update în cadrul aceluiași tabel:
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
acesta funcționează cu 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
);
Mai jos SQL a sugerat cineva, NU funcționează în SQL Server. Această sintaxă-mi aduce aminte de vechea mea scoala clasa:
UPDATE table2
SET table2.col1 = table1.col1,
table2.col2 = table1.col2,
...
FROM table1, table2
WHERE table1.memberid = table2.memberid
Toate celelalte interogări folosind NU
sau NU EXISTĂ
nu sunt recomandate. Null-uri apar pentru OP compară întregul set de date cu un mic subset, atunci, desigur, nu va fi o problemă de potrivire. Acest lucru trebuie să fie fixat prin scriere corectă SQL corecte "se ALĂTURE" în loc de ferindu-problemă, prin utilizarea NU
. S-ar putea rula în alte probleme prin utilizarea `NU " sau " NU EXISTĂ în acest caz.
Votul meu pentru cel de sus, care este modul convențional de actualizarea unui tabel bazat pe o altă masă de către aderarea la SQL Server. Cum am spus, nu puteți utiliza două tabele în același "ACTUALIZARE" declarație SQL Server dacă vă alăturați-le mai întâi.
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 ;
Am crezut că acest lucru este un exemplu simplu ar putea cineva să-l mai ușor,
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
Acest lucru vă va permite pentru a actualiza un tabel bazat pe coloana valoare nu a fost găsită într-un alt tabel.
UPDATE table1 SET table1.column = 'some_new_val' WHERE table1.id IN (
SELECT *
FROM (
SELECT table1.id
FROM table1
LEFT JOIN table2 ON ( table2.column = table1.column )
WHERE table1.column = 'some_expected_val'
AND table12.column IS NULL
) AS Xalias
)
Acest lucru va actualiza un tabel bazat pe coloana valoare a fost găsit în ambele tabele.
UPDATE table1 SET table1.column = 'some_new_val' WHERE table1.id IN (
SELECT *
FROM (
SELECT table1.id
FROM table1
JOIN table2 ON ( table2.column = table1.column )
WHERE table1.column = 'some_expected_val'
) AS Xalias
)
încercați acest lucru :
UPDATE
Table_A
SET
Table_A.AccountNumber = Table_B.AccountNumber ,
FROM
dbo.Sales_Import AS Table_A
INNER JOIN dbo.RetrieveAccountNumber AS Table_B
ON Table_A.LeadID = Table_B.LeadID
WHERE
Table_A.LeadID = Table_B.LeadID