Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Update Insert von Tabellen

Einklappen

Neue Werbung 2019

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

  • [Erledigt] Update Insert von Tabellen

    Hallo,

    habe folgendes Problem:
    Aus einer "Master Tabelle" diverse Daten in seperate Tabellen (insgesamt 22 Stück) aktualisieren/einfügen.
    Folgende Abfrage funktioniert aber ich muss immer dieselbe Abfrage 22 mal schreiben gibt es eine einfachere Lösung dafür.
    Die zu aktualisierende Tabelle sieht wie folgt aus:
    ID_Plant Plant ChangeDate -->
    ID_Plant ist Primärschlüssel
    Plant ist Unique
    ChangeDate ist on update current ....

    folgende Abfrage verwende ich:

    Update tblproductline AS E Inner Join tblpsrmonth AS T ON
    (E.Productline = T.Productline)
    SET E.Productline = T.Productline;
    INSERT IGNORE INTO tblproductline (Productline)
    SELECT Distinct T.Productline
    FROM tblpsrmonth AS T
    Left JOIN tblproductline AS E
    ON E.Productline = T.Productline;

    Update tbladhesive AS E Inner Join tblpsrmonth AS T ON
    (E.Adhesive = T.Adhesive)
    SET E.Adhesive = T.Adhesive;
    INSERT IGNORE INTO tbladhesive (Adhesive)
    SELECT Distinct T.Adhesive
    FROM tblpsrmonth AS T
    Left JOIN tbladhesive AS E
    ON E.Adhesive = T.Adhesive;


    Update tblplant AS E Inner Join tblpsrmonth AS T ON
    (E.Plant = T.Plant)
    SET E.Plant = T.Plant;
    INSERT IGNORE INTO tblplant (Plant)
    SELECT Distinct T.Plant
    FROM tblpsrmonth AS T
    Left JOIN tblplant AS E
    ON E.Plant = T.Plant;

    usw....

    Geht das auch einfacher ???

    Gruß
    Frank

  • #2
    Die Frage kann man nicht sinnvoll beantworten, bevor nicht erst mal geklärt ist, wozu diese 22 Tabellen dienen sollen bzw. welche Daten sie enthalten.
    [SIZE="1"]RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?[/SIZE]

    Kommentar


    • #3
      Hallo Chris,

      wie ich schon sagte es ist immer die gleiche Struktur.
      Es sind Daten welche im Varchar Format vorhanden sind und dem Zweck dienen (will mein Boss) wie auch immer, dass diese 22 Datenspalten in seperate Tabellen ausgelagert werden (aktualisiert und beigefügt.
      Sprich Import in Main Tabelle Reports anschl. aktualisieren und einfügen neuer DS in diese besagten 22 Tabellen.

      Gruß
      Frank

      Hoffe du/ihr könnt mir nun helfen.

      Kommentar


      • #4
        Zitat von frank1973 Beitrag anzeigen
        wie ich schon sagte es ist immer die gleiche Struktur.
        Das verletzt schon mal die erste Faustregel für's Datenbank-Design: Daten gleicher Struktur gehören auch in die gleiche Tabelle.

        Es sind Daten welche im Varchar Format vorhanden sind und dem Zweck dienen (will mein Boss) wie auch immer, dass diese 22 Datenspalten in seperate Tabellen ausgelagert werden
        Ein wirklicher, nachvollziehbarer Sinn hinter dem Vorgehen wird auch aus dieser „Erklärung“ noch nicht erkennbar. (Und das liegt nicht nur am Faktor schwer verständliche Formulierung bzw. sonderbarer Umgang mit deutscher Grammatik, sondern auch an der Kürze allgemein. Wenn die vorliegende Situation nachvollziehbar werden soll, musst du schon etwas mehr ins Detail gehen.)


        Wer bewusst von sinnvoller Datenmodellierung abweicht, der kann dann an den Umgang mit diesen Daten auch keine besonderen Ansprüche hinsichtlich „Einfachheit im Umgang damit“ mehr stellen.

        Aus dem, was du bisher zur Situation erklärt hast, kann man nur schlussfolgern, dass bei euch eine Diskussion zum Thema sinnvolle Datenmodellierung längst überfällig sein dürfte.
        [SIZE="1"]RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?[/SIZE]

        Kommentar


        • #5
          Hallo Chris,

          also Beleidigungen brauche ich mir nicht anhören.
          Es ist nach dem ER Model aufgebaut. Alle Daten sind gesamt in einer Tabelle allerdings erfordert es, dass bestimmte Daten hier nochmals ausgelagert werden müssen.
          Die Frage war lediglich wie ich die Abfragen evtl besser zusammenfassen kann.
          Nicht mehr und nicht weniger.

          Kommentar


          • #6
            Zitat von frank1973 Beitrag anzeigen

            Code:
            Update tblproductline AS E Inner Join tblpsrmonth AS T ON 
            (E.Productline = T.Productline)
            SET E.Productline = T.Productline;
            
            INSERT IGNORE INTO tblproductline (Productline)
            SELECT Distinct T.Productline
            FROM tblpsrmonth AS T
            Left JOIN tblproductline AS E
            ON E.Productline = T.Productline;
            Für mein Verständnis: Um welche Datenbank handelt es sich hier? Der UPDATE kommt mir Syntaktisch etwas komisch vor.

            Der UPDATE sieht formatiert so aus.

            Code:
            UPDATE tbladhesive AS e
                   INNER JOIN tblpsrmonth AS t
                     ON ( e.adhesive = t.adhesive )
            SET    e.adhesive = t.adhesive;
            Funktioniert dieser SQL oder fehlt da irgendwas?

            Du könntest zusätzlich die Tabellenstruktur einer der 22 Tabellen zeigen. Da hilft für das allgemeine Verständnis.


            Grüße
            Thomas

            Kommentar


            • #7
              Hallo Thomas,

              danke für deine Antwort. Mysql Datenbank.
              Ja es funktioniert, da die Spalte Adhesive Unique ist somit funktioniert es.

              Hab die Struktur beigefügt.

              Gruß
              Frank
              Angehängte Dateien

              Kommentar


              • #8
                Also momentan fällt mir keine einfachere Lösung ein, als den SQL-Block 22x auszuführen, da 22 Tabellen aktualisiert werden. Da läßt sich nichts zusammenfassen. Du könntest höchsten das Ganze in ein Stored Procedure packen, dann wird alles am Stück ausgeführt.
                Ich vermute, aus Performancegründen (z. B. Data Warehouse / Controlling) werden die Daten in die einzelnen Tabellen zerteilt. Zu hohe Normalisierung (warum auch immer) ist zwar formal korrekt, aber nicht unbedingt praktisch. Wie gesagt, eventuell das Ganze in ein Stored Procedure packen.

                Grüße
                Thomas

                Kommentar


                • #9
                  Hallo Thomas,

                  genau um sowas ähnliches geht es zwischen Controlling, Einkauf und Technische Datenbank.

                  Dachte mir schon, dass man es nicht einfacher handhaben kann aber ein Versuch war es Wert.

                  Was meinst du mit "Stored Procedure" habe ich noch nicht gehört.

                  Gruß
                  Frank

                  Kommentar


                  • #10
                    "Gespeicherte SQL Proceduren" in der Datenbank. Siehe CREATE PROCEDURE...

                    Da die ganze Procedure in der Datenbank gespeichert wird (und damit bereits geparst ist), kann eine SP meistens etwas schneller sein, als wenn mehrere SQL-Befehle einzeln zur Datenbank geschickt werden und jedes mal geprüft und dann ausgeführt werden.

                    Grüße
                    Thomas

                    Kommentar


                    • #11
                      Werde ich mir anschauen und wahrscheinlich auch so benutzen.
                      Ich denke es macht Sinn wie du es beschrieben hast.

                      Danke schon mal vorab für deine Hilfe

                      Kommentar


                      • #12
                        Hallo,

                        habe die Stored Procedure angelegt und funktioniert mit dem Aufruf "CALL Porcedure1" unter PHPMYADMIN sehr gut.

                        Jedoch jetzt ist mein Problem wie rufe ich die Stored Procedure unter PHP auf ??

                        Habe gegoogelt aber nichts gefunden was mir wahrlich weiterhilft.

                        Hoffe mir kann jemand weiterhelfen. Würde mich sehr freuen.

                        Anbei die SP:

                        DELIMITER $$

                        DROP PROCEDURE IF EXISTS `labelmanagement1`.`Procedure1` $$
                        CREATE PROCEDURE `labelmanagement1`.`Procedure1` ()
                        BEGIN
                        Update tblproductline AS E Inner Join tblpsrmonth AS T ON
                        (E.Productline = T.Productline)
                        SET E.Productline = T.Productline;
                        INSERT IGNORE INTO tblproductline (Productline)
                        SELECT Distinct T.Productline
                        FROM tblpsrmonth AS T
                        Left JOIN tblproductline AS E
                        ON E.Productline = T.Productline;

                        Update tbladhesive AS E Inner Join tblpsrmonth AS T ON
                        (E.Adhesive = T.Adhesive)
                        SET E.Adhesive = T.Adhesive;
                        INSERT IGNORE INTO tbladhesive (Adhesive)
                        SELECT Distinct T.Adhesive
                        FROM tblpsrmonth AS T
                        Left JOIN tbladhesive AS E
                        ON E.Adhesive = T.Adhesive;
                        .
                        .
                        .
                        END $$

                        DELIMITER ;

                        Kommentar


                        • #13
                          Zitat von frank1973 Beitrag anzeigen
                          Jedoch jetzt ist mein Problem wie rufe ich die Stored Procedure unter PHP auf ??
                          Genauso, wie im phpMyAdmin auch ...
                          [SIZE="1"]RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?[/SIZE]

                          Kommentar


                          • #14
                            Funktioniert mit "CALL () ". Anbei ein ORACLE-Beispiel aus dem Handbuch, kann aber sinngemäß auch für MySQL verwendet werden. Die oci Funktionen entsprechen für mysql umbauen..

                            Code:
                            $s = oci_parse($c, "call myproc(:data, :id)");
                            $data = "Chris";
                            $id = 123
                            oci_bind_by_name($s, ":data", $data);
                            oci_bind_by_name($s, ":id", $id);
                            oci_execute($s);
                            Grüße
                            Thomas

                            Kommentar


                            • #15
                              Hallo Thomas,

                              dein Vorschlag hat mich auf eine Idee gebracht jedoch hab ich dann eine andere Richtung eingeschlagen, da ich keine Ausgabe habe sondern nur Tabellen aktualisiert werden müssen.

                              Die Lösung sieht wie folgt aus und funktioniert:

                              PHP-Code:
                              # Verbindung zu MySqli herstellen
                              <?php
                                  $mysqli 
                              = new mysqli("localhost""root""passwort""datenbank");
                                  if (
                              mysqli_connect_errno(  )) {
                                      
                              printf("Verbindung nicht erfolgreich: %s\n"mysqli_connect_error(  ));
                                      exit (  );
                                  } else {
                                      
                              printf("Verbindung erfolgreich\n");
                                  }
                              ?>


                              <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
                              <html xmlns="http://www.w3.org/1999/xhtml">
                              <head>
                              <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
                              <title>Unbenanntes Dokument</title>
                              </head>

                              <body>
                              <?php
                              // Prozedur aufrufen 
                              $sql 'call Procedure1(  )';
                                  
                              $mysqli->query($sql);
                                  if (
                              $mysqli->errno) {
                                      die(
                              "Durchführung nicht erfolgreich: ".$mysqli->errno.": ".$mysqli->error);
                                  }
                                  else {
                                      
                              printf("Gespeicherte Prozedur Erfolgreich durchgeführt\n");
                                  }


                              ?>

                              </body>
                              </html>
                              Vielen Dank für die entgegengebrachte Unterstützung.
                              Gruß
                              Frank

                              Kommentar

                              Lädt...
                              X