when - tsql update merge




SQL-Aktualisierung von einer Tabelle zu einer anderen basierend auf einer ID-Übereinstimmung (14)

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

Ich habe eine Datenbank mit account numbers und card numbers . Ich vergleiche diese mit einer Datei, update alle Kartennummern auf die Kontonummer zu update , so dass ich nur mit Kontonummern arbeite.

Ich habe eine Ansicht erstellt, die die Tabelle mit der Konto- / Kartendatenbank verbindet, um die Table ID und die zugehörige Kontonummer zurückzugeben, und jetzt muss ich die Datensätze aktualisieren, in denen die ID mit der Kontonummer übereinstimmt.

Dies ist die Sales_Import Tabelle, in der das account number aktualisiert werden muss:

LeadID  AccountNumber
147         5807811235
150         5807811326
185         7006100100007267039

Und das ist die RetrieveAccountNumber Tabelle, von der ich aktualisieren muss:

LeadID  AccountNumber
147         7006100100007266957
150         7006100100007267039

Ich habe das unten versucht, 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 auf Kontonummern, aber die Kontonummern werden durch NULL


Dadurch können Sie eine Tabelle aktualisieren, die auf dem Spaltenwert basiert, der in einer anderen Tabelle nicht gefunden wird.

    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
    )

Dies aktualisiert eine Tabelle basierend auf dem Spaltenwert, der in beiden Tabellen gefunden wird.

    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
    )

Das folgende SQL, das 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 werden nicht empfohlen. Es werden NULL-Werte angezeigt, weil OP den gesamten Datensatz mit einer kleineren Teilmenge vergleicht, und dann gibt es natürlich ein passendes Problem. Dies muss behoben werden, indem man richtiges SQL mit korrektem JOIN schreibt, anstatt das Problem mit NOT IN . Sie könnten andere Probleme haben, indem NOT EXISTS in diesem Fall NOT IN oder NOT EXISTS .

Meine Stimme für die oberste, die herkömmliche Art der Aktualisierung einer Tabelle basierend auf einer anderen Tabelle durch Beitritt in SQL Server ist. Wie ich schon sagte, Sie können nicht zwei Tabellen in der gleichen UPDATE Anweisung in SQL Server verwenden, wenn Sie sie zuerst beitreten.


Die einfache Möglichkeit, 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 bestimmten Daten zu kopieren.


Für MySql :

UPDATE table1 JOIN table2 
ON table1.id = table2.id
SET table1.name = table2.name,
table1.`desc` = table2.`desc`

Für SQL-Server :

UPDATE table1
SET table1.name = table2.name,
table1.[desc] = table2.[desc]
FROM table1 JOIN table2 
ON table1.id = table2.id

Ich habe alle obigen Abfragen verwendet, aber sie funktionieren nicht. und als ich diesen benutzt habe, ist es fertig.

Sie können es auch hier https://.com/questions/5036918/update-one-table-with-data-from-another , https://.com/questions/5036918/update-one-table-with-data-from-another

Hoffe du bekommst es. Vielen Dank


Für MySql, das funktioniert gut:

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

Für SQL Server 2008 + Die Verwendung von MERGE anstelle der proprietären UPDATE ... FROM Syntax hat eine gewisse Anziehungskraft.

Es ist nicht nur Standard-SQL und daher portabler, es wird auch einen Fehler auslösen, wenn auf der Quellseite mehrere verbundene Zeilen vorhanden sind (und somit mehrere mögliche unterschiedliche Werte für die Aktualisierung), anstatt dass das Endergebnis unbestimmbar ist .

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

Leider kann die Auswahl, die zu verwenden ist, jedoch nicht auf den bevorzugten Stil zurückgeführt werden. Die Implementierung von MERGE in SQL Server wurde mit verschiedenen Fehlern behaftet. Aaron Bertrand hat hier eine Liste der berichteten zusammengestellt .


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

Ich glaube ein UPDATE FROM mit einem 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;

Ich hatte das gleiche Problem damit, dass foo.new für foo Zeilen, die keinen übereinstimmenden Schlüssel in bar hatten, auf null gesetzt wurde. Ich habe so etwas in Oracle gemacht:

update foo
set    foo.new = (select bar.new
                  from bar 
                  where foo.key = bar.key)
where exists (select 1
              from bar
              where foo.key = bar.key)

Ich möchte eine zusätzliche Sache hinzufügen.

Aktualisieren Sie einen Wert nicht mit demselben Wert. Dadurch wird zusätzliche Protokollierung und unnötiger Overhead generiert. Siehe Beispiel unten - es führt das Update nur für 2 Datensätze aus, obwohl es auf 3 verlinkt ist.

DROP TABLE #TMP1
DROP TABLE #TMP2
CREATE TABLE #TMP1(LeadID Int,AccountNumber NVarchar(50))
CREATE TABLE #TMP2(LeadID Int,AccountNumber NVarchar(50))

INSERT INTO #TMP1 VALUES
(147,'5807811235')
,(150,'5807811326')
,(185,'7006100100007267039');

INSERT INTO #TMP2 VALUES
(147,'7006100100007266957')
,(150,'7006100100007267039')
,(185,'7006100100007267039');

UPDATE A
SET A.AccountNumber = B.AccountNumber
FROM
    #TMP1 A 
        INNER JOIN #TMP2 B
        ON
        A.LeadID = B.LeadID
WHERE
    A.AccountNumber <> B.AccountNumber  --DON'T OVERWRITE A VALUE WITH THE SAME VALUE

SELECT * FROM #TMP1

Scheint, dass Sie MSSQL verwenden, dann, wenn ich mich richtig erinnere, wird es so gemacht:

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

Wenn obige Antworten nicht für Sie funktionieren, versuchen Sie dies

Update Sales_Import A left join RetrieveAccountNumber B on A.LeadID = B.LeadID
Set A.AccountNumber = B.AccountNumber
where A.LeadID = B.LeadID 

Versuche dies :

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




sql-update