Announcement

Collapse
No announcement yet.

Kreuztabellenabfrage?

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

  • Kreuztabellenabfrage?

    Hallo Leute,

    ich habe folgende Aufgabe:

    zu großen Lieferungen werden uns immer wieder entsprechende Lieferdaten geliefert, diese Landen in einer MySQL Tabelle namens "Lieferungen", die relevanten Felder hierbei sind:
    Lieferung/Artikelnr
    z. B.:
    1 | A
    1 | B
    1 | C
    1 | D
    2 | A
    2 | B
    2 | C
    2 | D
    3 | A
    3 | G
    3 | C
    3 | D
    4 | A
    4 | B
    4 | C
    4 | D

    Pro Lieferung muss geprüft werden, ob die Artikelkombination zulässig ist, diese sind in einer Referenztabelle "Artikelkomb" hinterlegt, in den Spalten:
    Kombination / Artikel1 / Artikel2 / Artikel3 / Artikel4, hierbei ist z. B. folgendes hinterlegt:
    1001 | A | B | C | D

    Darüber hinaus gibt es noch eine Referenztabelle, wo die Artikelarten pro Artikel hinterlegt sind, "Artikel". Diese wird benötigt, da nicht davon auszugehen ist, dass die Artikel bei den Lieferungen immer in der richtigen Reihenfolge kommen. Die Spalten in der Tabelle "Artikel" lauten:
    Artikelnr / Artikelart, ergibt z. B.:
    A | Artikel1
    B | Artikel2
    C | Artikel3
    D | Artikel4

    Mein erster Lösungsansatz war nun, dass ich in meiner Anwendung (VBA), die Lieferungen gruppiere und dann in einer Schleife pro Lieferung die Kombinationen zusammenstelle, d. h.
    1. SELECT Lieferung FROM Lieferungen GROUP BY Lieferung -> Recordset1
    2. Schleife (1.)...
    SELECT l.Artikelnr, a.Artikelart FROM Lieferungen AS l INNER JOIN Artikel AS a
    ON l.Artikelnr=a.Artikelnr WHERE l.Lieferung=<Recordset1!Lieferung>
    -> Recordset2
    Schleife (2.)...
    Zusammenstellen eines SQL-IN-Statements, d. h.
    sVAR_IN_STATE = sVAR_IN_STATE & Recordset2!Artikelart & "='" & Recordset2!Artikelart & "'"
    ...Schleife(2.)
    ...Schleife (1.)

    3. Nach Schleife 2.
    Abfrage der Gültigkeit: z. B:
    SELECT * FROM Artikelkomb WHERE & sVAR_IN_STATE, also im Klartext:
    SELECT * FROM Artikelkomb WHERE Artikel1='A' AND Artikel2='B' usw.

    4. Falls die Abfrage kein Ergebnis liefert, was bei Lieferung3 der Fall ist, muss eine entsprechende Aktion an den Datensätzen der Lieferung vorgenommen werden (UPDATE...SET STATUS='ungueltig', o. ä.)

    Es sind also pro Lieferung 4 Schritte vorzunehmen, was sich natürlich bei größeren Datenmengen in der Tabelle mit den Lieferungen sehr negativ auf die Performance auswirkt. Mitunter kommen 500000 Datensätze auf einen Schlag.

    Hättet Ihr einen Tipp für mich, wie man das Ganze beschleunigen kann?
    Ich weiß, dass VBA nicht das optimale Werkzeug ist, ich habe aber nichts anderes zur Hand... Entsprechende Indizes habe ich auch schon gesetzt.
    Mir ist eben so eine Art Kreuztabellenabfrage (Access) vorgeschwebt, wie könnte man sowas auf MYSQL ummünzen? Oder was könnte man sonst noch machen? Ich muss übrigens die 3 Tabellen so verwenden, da das so etwas wie eine interne Firmennorm ist.
Working...
X