it-swarm.com.de

SQL-Update von einer Tabelle zur anderen basierend auf einer ID-Übereinstimmung

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.

803
Boerseun

Ich glaube ein UPDATE FROM mit einer JOIN wird helfen

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

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

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.

269
Shivkant

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.

150
Martin Smith

Allgemeine Antwort für zukünftige Entwickler. 

SQL Server

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

Oracle (und 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

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
33
Vinko Vrsalovic

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) 
29

Für PostgreSQL:

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

Für MySql funktioniert das gut:

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

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

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];
11
Abhimanyu

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.

3
Gil Baggio

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.

3
Dr Inner Join

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
3
NCP

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
);
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

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
1
user824910

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