1164 Stimmen

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

Ich habe eine Datenbank mit Kontonummern und Kartennummern. Ich gleiche diese mit einer Datei ab, um alle Kartennummern auf die Kontonummer zu aktualisieren, damit ich nur mit Kontonummern arbeite.

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

Das ist die Tabelle Sales_Import, in der das Feld Kontonummer aktualisiert werden muss:

LeadID

Kontonummer

147

5807811235

150

5807811326

185

7006100100007267039

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

LeadID

Kontonummer

147

7006100100007266957

150

7006100100007267039

Ich habe das Folgende versucht, aber bisher kein Glück:

UPDATE [Sales_Lead].[dbo].[Sales_Import] 
SET    [Kontonummer] = (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 ersetzt

7voto

ABODE Punkte 748

Dies ist das einfachste und beste, das ich für Mysql und Maria DB gesehen habe

UPDATE table2, table1 SET table2.by_department = table1.department WHERE table1.id = table2.by_id

Hinweis: Falls Sie den folgenden Fehler basierend auf Ihrer Mysql/Maria DB-Version erhalten "Fehlercode: 1175. Sie verwenden den sicheren Aktualisierungsmodus und haben versucht, eine Tabelle ohne WHERE zu aktualisieren, die eine SCHLÜSSEL-Spalte verwendet deaktivieren Sie den sicheren Modus, aktivieren Sie die Option in den Einstellungen"

Führen Sie dann den Code wie folgt aus

SET SQL_SAFE_UPDATES=0;
UPDATE table2, table1 SET table2.by_department = table1.department WHERE table1.id = table2.by_id

5voto

jakentus Punkte 886

Es funktioniert mit Postgresql

UPDATE-Anwendung
SET omts_erhaltenes_Datum = (
    SELECT
        date_created
    FROM
        application_history
    WHERE
        application.id = application_history.application_id
    AND application_history.application_status_id = 8
);

4voto

NCP Punkte 59

Aktualisierung 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,'geänderte Personendaten',  0);
    INSERT INTO @TB1 VALUES(2,'alte verknüpfte Personendaten', 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

2voto

dobrivoje Punkte 719

MYSQL (Dies ist meine bevorzugte Methode zur Wiederherstellung aller bestimmten Spaltenwerte reasonId, basierend auf der Primärschlüsselequivalenz von id)

UPDATE `site` AS destination  
INNER JOIN `site_copy` AS backupOnTuesday 
      ON backupOnTuesday.`id` = destination.`id`
SET destdestination.`reasonId` = backupOnTuesday.`reasonId`

2voto

Uladzimir Punkte 450

Zusammenfassung der anderen Antworten: Es gibt 4 Varianten, wie die Ziel-Tabelle mit Daten aus einer anderen Tabelle aktualisiert werden kann, nur wenn ein "Match" vorhanden ist

Abfrage und Unterabfrage:

update si
set    si.Kontonummer = (
    select ran.Kontonummer 
    from   RetrieveKontonummer ran
    where  si.LeadID = ran.LeadID
)
from Sales_Import si
where exists (select * from RetrieveKontonummer ran where ran.LeadID = si.LeadID)

Inner Join:

update si
set si.Kontonummer = ran.Kontonummer
from Sales_Import si inner join RetrieveKontonummer ran on si.LeadID = ran.LeadID

Cross Join:

update si
set si.Kontonummer = ran.Kontonummer
from Sales_Import si, RetrieveKontonummer ran
where si.LeadID = ran.LeadID

Merge:

merge into Sales_Import si
using RetrieveKontonummer ran on si.LeadID = ran.LeadID 
when matched then update set si.Kontonummer = ran.Kontonummer;

Alle Varianten sind mehr oder weniger trivial und verständlich, persönlich bevorzuge ich die "inner join" Option. Aber jede davon könnte verwendet werden und der Entwickler muss die "bessere Option" gemäß seiner/ihrer Bedürfnisse auswählen

Von der Leistungsseite betrachtet sind Varianten mit Joins bevorzugt: enter image description here

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X