Ankündigung

Einklappen
Keine Ankündigung bisher.

2 Tabellen zusammenführen (merge) in MySQL

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • 2 Tabellen zusammenführen (merge) in MySQL

    Hallo Gemeinde,

    ich sitze seit einigen Tagen an folgendem Problem:

    Ich habe 2 gleichaufgebaute Tabellen mit zum Teil gleichem Inhalt, die ich nun zusammenführen möchte.

    In beiden Tabellen gibt es neben der ID (auto increment) auch noch eine Spalte mit einer eindeutigen Nummer pro Eintrag.

    Nun soll folgendes passieren:

    Falls in der Zieltabelle (Target) diese eindeutige Nummer bereits existiert, sollen einige Spalteneinträge mittels der Daten aus der Vorlagetabelle (Source) aktualisiert (UPDATE) werden;

    falls in der Zieltabelle diese eindeutige Nummer NICHT existiert, soll aus der Vorlagetabelle (Source) die jeweilige gesamte Zeile hinzugefügt (INSERT) werden.

    Gibt es eine Lösung in Form von
    Code:
    MERGE Target AS T
    USING Source AS S
    ON (T.EmployeeID = S.EmployeeID) 
    WHEN NOT MATCHED BY TARGET 
        THEN INSERT(EmployeeID, EmployeeName) VALUES(S.EmployeeID, S.EmployeeName)
    WHEN MATCHED 
        THEN UPDATE SET T.EmployeeName = S.EmployeeName
    ??
    (was, glaube ich, leider nur bei SQL und nicht bei MySQL funktioniert)

    Ich würde mich über einen Lösungsansatz echt freuen!

    Gruß estebu


  • #2
    Warum machst Du nicht zunächst ein update und dann ein insert? Muß das unbedingt in einer Abfrage laufen oder habe ich Dich falsch verstanden?

    Kommentar


    • #3
      Nein, das wäre ziemlich gleichgültig, ob es gleichzeitig oder nacheinander passiert. Ich komme nur nicht darauf, wie ich den Befehl so beschreibe, dass nur bestimmte Spalten der Tabelle ein UPDATE bekommen sollen
      und zwar auch nur DANN, wenn eine Spalte namens "nummer" den gleichen Inhalt in der Ziel- und Quell-Tabelle hat.

      Etwas so könnte ich es mir vorstellen:
      Code:
      UPDATE Zieltabelle SET Zieltabelle.Feld1 = (SELECT (Quelltabelle.Feld1) FROM Quelltabelle WHERE Zieltabelle.Vergleichsfeld = Quelltabelle.Vergleichsfeld)
      Leider gibt MySQL folgende Meldung zurück: #1242 - Subquery returns more than 1 row
      (was ja auch sehr logisch ist) - aber wie nur sage ich dem Statement, dass es dieses UPDATE für ALLE gefundenen Datensätze durchführen soll, deren Vergleichsfelder den gleichen Wert besitzen!? Es bräuchte dort wahrscheinlich irgendetwas wie eine foreach-Schleife....

      Kommentar


      • #4
        http://dev.mysql.com/doc/refman/5.1/...duplicate.html
        http://dev.mysql.com/doc/refman/5.1/...rt-select.html
        Könnte interessant sein.
        Relax, you're doing fine.
        RTFM | php.de Wissenssammlung | Datenbankindizes | Dateien in der DB?

        Kommentar


        • #5
          Darauf bin ich auch bereits gestoßen, es hilft mir nur leider nicht weiter.
          Beim ersten Link geht es, so scheint es mir, nur um einzelne Datensätze und nicht um das Abarbeiten einer gesamten Tabelle. Vor allem finde ich dort keinen Ansatz, wie ich einen speziellen KEY zuweisen kann, der auf ein Duplikat hin geprüft werden soll.

          Und beim zweiten Link geht es um INSERTS und nicht um UPDATES, demzufolge stimmt leider das gesamte Statement nicht mehr
          Code:
          INSERT INTO tbl_temp2 (fld_id)
            SELECT tbl_temp1.fld_order_id
            FROM tbl_temp1 WHERE tbl_temp1.fld_order_id > 100;
          funktioniert vielleicht mit INSERTS, aber leider nicht mit UPDATE

          Kommentar


          • #6
            Code:
            update target_table
            join (select employeeid, employeename from source_table) source
            on target_table.employeeid = source.employeeid
            set target_table.employeename = source.employeename
            Sowas?

            Kommentar


            • #7
              Zitat von estebu Beitrag anzeigen
              Darauf bin ich auch bereits gestoßen, es hilft mir nur leider nicht weiter.
              Doch, ON DUPLICATE KEY UPDATE ist in Mysql die Alternative zu MERGE.

              PHP-Code:
              INSERT INTO target (EmployeeIDEmployeeName)
              SELECT S.EmployeeIDS.EmployeeName FROM Source AS S
              ON DUPLICATE KEY UPDATE target
              .EmployeeName S.EmployeeName 

              Kommentar


              • #8
                @erc

                Das sieht im Grunde genau so aus, wie das, was ich suche
                NUR: wie sage ich dem Statement, WELCHER KEY explizit verglichen werden soll? Oder sehe ich es nur nicht??

                INSERT INTO target (EmployeeID, EmployeeName)
                (- Setze "EmployeeID" und "EmployeeName" ein in Tabelle "target")

                SELECT S.EmployeeID, S.EmployeeName FROM Source AS S
                (wähle dazu aus der Tabelle "Source" die Spalten "EmployeeID" und "EmployeeName")

                ON DUPLICATE KEY UPDATE target.EmployeeName = S.EmployeeName
                (und ersetze dabei im Falle eines DUPLICATE KEY die Spalte "EmployeeName" der Tabelle "target" mit dem Inhalt der Spalte "EmployeeName" aus der Tabelle "Source")

                meint dieses Statement, dass der zu vergleichende (und dabei nicht zu verändernde) KEY nun "EmployeeID" sein soll?

                erstaunlich, wenn das so einfach wäre ...

                Kommentar


                • #9
                  NUR: wie sage ich dem Statement, WELCHER KEY explizit verglichen werden soll? Oder sehe ich es nur nicht??
                  Du sagst dort gar nichts.

                  Die Datenbank reagiert auf Verletzung einer UNIQUE Regel, dabei ist es egal, welches der Felder UNIQUE sein soll - sobald beim Einfügen ein bereits vorhandener Wert eingefügt werden soll, greift die Regel.

                  Nachzulesen in:
                  http://dev.mysql.com/doc/refman/5.1/...duplicate.html
                  Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

                  Kommentar

                  Lädt...
                  X