Announcement

Collapse
No announcement yet.

Zwei Tabellen performant in MySQL abgleichen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Zwei Tabellen performant in MySQL abgleichen

    Hallo zusammen,

    ich stehe vor einem Problem bei dem ich nicht so recht weiterkomme. Ich habe zwei Tabellen die ich miteinander abgleichen möchte, d.h. geänderte Daten der
    Quelltabelle sollen in der Zieltabelle landen. Die Primärschlüssel haben nichts miteinander zu tun, können also bei identischen werte und Zahlen unterschiedlich
    sein.

    Der Aufbau der Tabellen ist wie folgt:

    Quelltabelle
    Id | Wert1 | Wert2 | Zahl1 | Zahl2
    1 | 1 | A | 1 | 6
    2 | 5 | B | 2 | 7
    3 | 7 | C | 4 | 9

    Zieltabelle
    Id | Wert1 | Wert2 | Zahl1 | Zahl2
    5 | 1 | A | 0 | 7
    9 | 5 | B | 8 | 5
    17 | 7 | C | 2 | 10

    Ziel soll es sein, dass die Zieltabelle identische Werte enthält wie die Quelltabelle unabhängig von der Id. Von der Logik her muss es also in etwa "Wenn Wert1 und
    Wert2 jeweils übereinstimmen, und sich Zahl1 und Zahl2 in den Tabellen unterscheiden, dann aktualisiere Zahl1 und Zahl2".

    Bei einem SQL könnte ich ja mit MINUS arbeiten, was es aber leider nicht bei MySQL gibt. Mit LEFT JOIN bekomme ich es ebenfalls nicht gelöst. Über ein bisschen
    Hilfe würde ich mich sehr freuen.

  • #2
    https://www.mysqltutorial.org/mysql-minus/
    https://www.tutorialspoint.com/How-c...QL-MINUS-query

    Sicherlich kann man das über einen Join lösen, dessen Bedingung eben "wenn a.Wert1=b.Wert1 und a.Wert2=b.Wert2 und a.Zahl1!=b.Zahl1 und a.Zahl2!=b.Zahl2" ist.

    Code:
    WITH tab1 (wert1,wert2,zahl1,zahl2) AS
    (
      SELECT 100,200,1,2
      UNION ALL
      SELECT 1000,2000,3,4
     ),
     tab2 (wert1,wert2,zahl1,zahl2) AS
    (
      SELECT 100,200,1,2
      UNION ALL
      SELECT 1000,2000,5,6
     )
    SELECT distinct a.wert1,a.wert2,a.zahl1,a.zahl2 FROM tab1 a,tab2 b
     where a.wert1=b.wert1 and a.wert2=b.wert2 and a.zahl1!=b.zahl1 and a.zahl2!=b.zahl2
    ;
    Zuletzt editiert von Christian Marquardt; 02.05.2021, 10:17.
    Christian

    Comment


    • #3
      Hallo Christian,

      Danke für deine Hilfe. Ich habe zwischenzeitlich mein Problem gefunden... sobald in der Zieltabelle ein Wert NULL war, hat der Abgleich in der WHERE nicht
      mehr funktioniert. Mein erster Ansatz sieht jetzt einmal so aus, ist nicht optimal funktioniert aber bereits. Wenn ich die SELECT aus der WHERE aufrufe, läuft
      diese 10 Sekunden (bei 8.000 Datensätzen) und zeigt mir nur die Ids aus der Zieltabelle an, welche unterschiedlich zur Quelltabelle sind.

      Wenn ich aber das Update so laufen lasse, benötigt dieses immer um die 90 Sekunden, selbst wenn ich nur einen Unterschied darin habe. Wie könnte ich das
      noch einmal beschleunigen (ja, die SELECT für den Wert ist alles andere al optimal)?

      UPDATE Zieltabelle SET
      Zahl1=(SELECT Zahl1 FROM Quelltabelle WHERE (Wert1=Zieltabelle.Wert1 AND Wert2=Zieltabelle.Wert2))
      WHERE Id IN
      (SELECT ziel.Id FROM Quelltabelle AS quelle
      LEFT JOIN (SELECT * FROM Zieltabelle) AS ziel
      ON (quelle.Wert1=ziel.Wert1 AND quelle.Wert2=ziel.Wert2)
      WHERE (quelle.Zahl1 NOT LIKE ziel.Zahl1 OR (quelle.Zahl1 IS NOT NULL AND ziel.Zahl1 IS NULL)))

      Comment

      Working...
      X