Announcement

Collapse
No announcement yet.

SQL Update, Select zweier Tabellen

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

  • SQL Update, Select zweier Tabellen

    Hallo!
    Ich bitte um Hilfe bei folgendem Problem:
    Ich habe 2 Tabellen: ARTIKEL_IMPORT und ARTIKEL

    Die Tabelle ARTIKEL_IMPORT enthält alle Artikel. Also neue und teilweise alte Artikel.

    Ich möchte auf dieser Grundlage den Artikelstand, Preis und andere Felder der Tabelle ARTIKEL aktualisieren!

    Eindeutige Zuordnung ist über 2 Felder möglich:
    ARTIKELNR und BARCODE

    Hier mein Ansatz zum Imort: funktioniert soweit gut:
    [highlight=sql]
    INSERT INTO ARTIKEL
    SELECT * FROM ARTIKEL_IMPORT WHERE ARTNUM NOT IN
    (SELECT ARTNUM FROM ARTIKEL)
    OR BARCODE NOT IN
    (SELECT BARCODE FROM ARTIKEL)
    [/highlight]
    ---------
    Mein Problem liegt beim UPDATE von Preisen:

    [highlight=sql]
    UPDATE ARTIKEL
    SET ARTIKEL.EK_PREIS =
    (SELECT ARTIKEL_IMPORT.EK_PREIS
    FROM ARTIKEL_IMPORT
    WHERE ARTIKEL.ARTNUM = ARTIKEL_IMPORT.ARTNUM
    AND ARTIKEL.BARCODE = ARTIKEL_IMPORT.BARCODE),
    ARTIKEL.VK1 =
    (SELECT ARTIKEL_IMPORT.VK1
    FROM ARTIKEL_IMPORT
    WHERE ARTIKEL.ARTNUM = ARTIKEL_IMPORT.ARTNUM
    AND ARTIKEL.BARCODE = ARTIKEL_IMPORT.BARCODE),
    ARTIKEL.VK1B =
    (SELECT ARTIKEL_IMPORT.VK1B
    FROM ARTIKEL_IMPORT
    WHERE ARTIKEL.ARTNUM = ARTIKEL_IMPORT.ARTNUM
    AND ARTIKEL.BARCODE = ARTIKEL_IMPORT.BARCODE),
    ARTIKEL.VK2 =
    (SELECT ARTIKEL_IMPORT.VK2
    FROM ARTIKEL_IMPORT
    WHERE ARTIKEL.ARTNUM = ARTIKEL_IMPORT.ARTNUM
    AND ARTIKEL.BARCODE = ARTIKEL_IMPORT.BARCODE),
    ARTIKEL.VK2B =
    (SELECT ARTIKEL_IMPORT.VK2B
    FROM ARTIKEL_IMPORT
    WHERE ARTIKEL.ARTNUM = ARTIKEL_IMPORT.ARTNUM
    AND ARTIKEL.BARCODE = ARTIKEL_IMPORT.BARCODE)
    WHERE REC_ID = (SELECT REC_ID FROM ARTIKEL_IMPORT WHERE REC_ID=ARTIKEL.REC_ID)
    AND USERFELD_01 <> 1
    [/highlight]

    ---------

    Das funktioniert zwar grundsätzlich, dauert aber sehr lange:
    Bei 5000 Artikeln 5Minuten.

    ----> Meine Frage: Kann man das vereinfachen, sodass es schneller läuft?

    Ich bitte um Hilfe!
    Zuletzt editiert von johnp; 15.01.2010, 17:39.

  • #2
    Hallo und willkommen,

    man kann vor allem dann helfen, wenn der Code lesbar ist. Benutze dafür:
    [highlight=sql]SELECT ... [/highlight]
    ... und brauchbare Einrückungen.

    Das kannst du auch nachträglich durch Editieren erledigen - bitte tu dies! Jürgen

    Comment


    • #3
      Originally posted by johnp View Post

      Mein Problem liegt beim UPDATE von Preisen:



      Das funktioniert zwar grundsätzlich, dauert aber sehr lange:
      Bei 5000 Artikeln 5Minuten.

      ----> Meine Frage: Kann man das vereinfachen, sodass es schneller läuft?

      Ich bitte um Hilfe!
      Hallo,

      Ersetzte doch die Subqueries durch einen Join und fahr dann die Updates


      Gruss

      Comment


      • #4
        Hallo johnp,

        je nach DBMS kann man auch eine DB-Procedur schreiben. In dieser kann man ein select laufen lassen, dass in einer FOR-Schleife die Updates durchführt.

        Schöne Grüße...

        Comment


        • #5
          Hallo
          Originally posted by dbwizard View Post
          ...Ersetzte doch die Subqueries durch einen Join und fahr dann die Updates
          Nicht jedes DBMS unterstützt JOINs in Updates und da wir uns hier im SQL-Forum befinden...
          Originally posted by A. Fuss View Post
          ...je nach DBMS kann man auch eine DB-Procedur schreiben. In dieser kann man ein select laufen lassen, dass in einer FOR-Schleife die Updates durchführt.
          Ob das dann schneller ist?

          Gruß Falk
          Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

          Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

          Comment


          • #6
            Vielleicht kannst Du ja die Tabellenstruktur posten und das was Du haben möchtest formulieren, dann könnte man Dir auch besser helfen. Vielleicht ist ja auch das SQL Kommando unnötig kompliziert. Ich hätte jedenfalls keine Lust das obige SQL Kommando auseinander zu pfriemeln

            Comment


            • #7
              ... und solange er trotz Bitte den Code nicht lesbarer macht, lohnt sich für uns ein Nachdenken eher nicht. Jürgen

              Comment


              • #8
                Danke schonmal für Eure Hilfe!
                Ich habe nun die Highlight Tags gesetzt, das sollte helfen!

                Ich werde mal probieren das ganze in einer FOR Schleife durchlaufen zu lassen und dann berichten!

                Danke, bis bald!

                Comment


                • #9
                  Originally posted by fanderlf View Post
                  Vielleicht kannst Du ja die Tabellenstruktur posten und das was Du haben möchtest formulieren, dann könnte man Dir auch besser helfen. Vielleicht ist ja auch das SQL Kommando unnötig kompliziert. Ich hätte jedenfalls keine Lust das obige SQL Kommando auseinander zu pfriemeln
                  ...Ja, ich könnte mir eben auch vorstellen, dass es da was einfacheres gibt!

                  Was ich machen will ist ein Produktupdate der Tabelle ARTIKEL, das heißt: Preise (EK_PREIS, VK1,...) aktualisieren.

                  Dazu stehen alle neuen Daten in der Tabelle ARTIKEL_IMPORT.
                  Ich möchte nun die "Arbeitstabelle" ARTIKEL (hier hängt ein Warenwirtschaftssystem dran) aktualisieren.
                  ( Jedoch nur wenn ARTIKEL.USERFELD <> 1 )

                  Die Anzahl der Datensätze in ARTIKEL ist größer als in ARTIKEL_IMPORT.
                  Es sollen auch keine Datensätze aus ARTIKEL gelöscht werden.

                  Welches wäre hier die beste Methode? Zum identifizieren der Datensätze brauche ich 2 Einträge, nämlich ARTNUM und BARCODE).

                  Comment


                  • #10
                    Originally posted by johnp View Post

                    Welches wäre hier die beste Methode? Zum identifizieren der Datensätze brauche ich 2 Einträge, nämlich ARTNUM und BARCODE).
                    Welche DB hast du denn ?

                    Gruss

                    Comment

                    Working...
                    X