Ich habe eine Datenbank mit account numbers
und card numbers
. Ich ordne diese einer Datei zu update
jeder Kartennummer an die Kontonummer an, so dass ich nur mit Kontonummern arbeite.
Ich habe eine Ansicht erstellt, die die Tabelle mit der Konto-/Kartendatenbank verknüpft, um den Table ID
und die zugehörige Kontonummer zurückzugeben. Jetzt muss ich die Datensätze aktualisieren, deren ID mit der Kontonummer übereinstimmt.
Dies ist die Sales_Import
-Tabelle, in der das account number
-Feld aktualisiert werden muss:
LeadID AccountNumber
147 5807811235
150 5807811326
185 7006100100007267039
Und dies ist die RetrieveAccountNumber
-Tabelle, von der aus ich aktualisieren muss:
LeadID AccountNumber
147 7006100100007266957
150 7006100100007267039
Ich habe das unten ausprobiert, aber bisher kein Glück:
UPDATE [Sales_Lead].[dbo].[Sales_Import]
SET [AccountNumber] = (SELECT RetrieveAccountNumber.AccountNumber
FROM RetrieveAccountNumber
WHERE [Sales_Lead].[dbo].[Sales_Import]. LeadID =
RetrieveAccountNumber.LeadID)
Es aktualisiert die Kartennummern mit Kontonummern, die Kontonummern werden jedoch durch NULL
ersetzt.
Ich glaube ein UPDATE FROM
mit einer JOIN
wird helfen
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;
Der einfache Weg, den Inhalt von einer Tabelle in eine andere zu kopieren, ist wie folgt:
UPDATE table2
SET table2.col1 = table1.col1,
table2.col2 = table1.col2,
...
FROM table1, table2
WHERE table1.memberid = table2.memberid
Sie können auch die Bedingung hinzufügen, um die jeweiligen Daten zu kopieren.
Für SQL Server 2008 + hat die Verwendung von MERGE
anstelle der proprietären UPDATE ... FROM
-Syntax einige Anziehungskraft.
Sie ist nicht nur Standard-SQL und daher auch portabler, sondern führt auch zu einem Fehler, wenn auf der Quellenseite mehrere verbundene Zeilen vorhanden sind (und somit mehrere mögliche unterschiedliche Werte, die in der Aktualisierung verwendet werden sollen), und das Endergebnis nicht unbestimmt ist .
MERGE INTO Sales_Import
USING RetrieveAccountNumber
ON Sales_Import.LeadID = RetrieveAccountNumber.LeadID
WHEN MATCHED THEN
UPDATE
SET AccountNumber = RetrieveAccountNumber.AccountNumber;
Leider kann die Wahl des zu verwendenden Typs jedoch nicht nur auf den bevorzugten Stil fallen. Die Implementierung von MERGE
in SQL Server wurde mit verschiedenen Fehlern behaftet. Aaron Bertrand hat eine Liste von der hier berichteten zusammengestellt.
Allgemeine Antwort für zukünftige Entwickler.
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;
Anscheinend verwenden Sie MSSQL. Wenn ich mich recht erinnere, geschieht dies folgendermaßen:
UPDATE [Sales_Lead].[dbo].[Sales_Import] SET [AccountNumber] =
RetrieveAccountNumber.AccountNumber
FROM RetrieveAccountNumber
WHERE [Sales_Lead].[dbo].[Sales_Import].LeadID = RetrieveAccountNumber.LeadID
Ich hatte das gleiche Problem, dass foo.new
auf null
für Zeilen von foo
gesetzt wurde, die keinen passenden Schlüssel in bar
hatten. Ich habe so etwas in Oracle gemacht:
update foo set foo.new = (Wählen Sie bar.new aus bar Dabei ist foo.key = bar.key). Dabei ist foo.key = bar.key)
Für PostgreSQL:
UPDATE Sales_Import SI
SET AccountNumber = RAN.AccountNumber
FROM RetrieveAccountNumber RAN
WHERE RAN.LeadID = SI.LeadID;
Für MySql funktioniert das gut:
UPDATE
Sales_Import SI,RetrieveAccountNumber RAN
SET
SI.AccountNumber = RAN.AccountNumber
WHERE
SI.LeadID = RAN.LeadID
Danke für die Antworten. Ich habe eine Lösung gefunden.
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)
Folgendes hat bei mir in SQL Server funktioniert:
UPDATE [AspNetUsers] SET
[AspNetUsers].[OrganizationId] = [UserProfile].[OrganizationId],
[AspNetUsers].[Name] = [UserProfile].[Name]
FROM [AspNetUsers], [UserProfile]
WHERE [AspNetUsers].[Id] = [UserProfile].[Id];
Verwenden Sie den folgenden Abfrageblock, um Table1 anhand der ID mit Table2 zu aktualisieren:
UPDATE Sales_Import, RetrieveAccountNumber
SET Sales_Import.AccountNumber = RetrieveAccountNumber.AccountNumber
where Sales_Import.LeadID = RetrieveAccountNumber.LeadID;
Dies ist der einfachste Weg, um dieses Problem anzugehen.
Die unten angegebene SQL-Anweisung, die jemand vorgeschlagen hat, funktioniert NICHT in SQL Server. Diese Syntax erinnert mich an meine alte Schulklasse:
UPDATE table2
SET table2.col1 = table1.col1,
table2.col2 = table1.col2,
...
FROM table1, table2
WHERE table1.memberid = table2.memberid
Alle anderen Abfragen, die NOT IN
oder NOT EXISTS
verwenden, werden nicht empfohlen. NULL-Werte werden angezeigt, da OP die gesamte Datenmenge mit einer kleineren Teilmenge vergleicht. Dann gibt es natürlich ein Übereinstimmungsproblem. Dies muss behoben werden, indem korrektes SQL mit der korrekten JOIN
geschrieben wird, anstatt das Problem mithilfe von NOT IN
auszuweichen. In diesem Fall können Sie mit NOT IN
oder NOT EXISTS
auf andere Probleme stoßen.
Ich stimme für die oberste, die herkömmliche Methode zum Aktualisieren einer Tabelle basierend auf einer anderen Tabelle durch Beitritt in SQL Server. Wie bereits gesagt, können Sie nicht zwei Tabellen in derselben UPDATE
-Anweisung in SQL Server verwenden, es sei denn, Sie verbinden sie zuerst.
update innerhalb derselben Tabelle:
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
es funktioniert mit 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 ;
Ich dachte, dies ist ein einfaches Beispiel.
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
Falls sich die Tabellen in einer anderen Datenbank befinden. (SQL Server)
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;