Announcement

Collapse
No announcement yet.

Join-Problem?!!!?

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

  • Join-Problem?!!!?

    Hallo,
    leider bin ich durch das "korrekte" Joinen von Tabellen noch nicht ganz durchgestiegen.
    Das Problem fängt an, wenn ich Summen aus gejointen Tabellen ermitteln muß.
    <br><br>
    Anbei meine Aufgabenstellung:<br><br>

    Tabelle1 = "artikel"<br>
    -Spalte1 = "artikelnummer"<br>
    -Spalte2 = "artikelbezeichnung"<br>
    <br><br>
    Tabelle2 = "bestand"<br>
    -Spalte1 = "artikelnummer"<br>
    -Spalte2 = "verfalldatum"<br>
    -Spalte3 = "bestand"<br>
    <br><br>
    Tabelle3 = "auftragsposition"<br>
    -Spalte1 = "auftrag"<br>
    -Spalte2 = "artikelnummer"<br>
    -Spalte3 = "bestellt"<br>
    -Spalte4 = "bereitsgeliefert"<br>
    <br><br>
    Angenommen ich habe einen Artikel "4711" der mehrere Einträge in "bestand" (auf Grund verschiedener Verfalldaten) hat und natürlich mehrere Einträge in "auftragsposition" (weil dieser bereits öfter bestellt wurde)<br><br>

    Ich habe versucht den nun aktuell verfügbaren Bestand mit folgender SQL-Anweisung herauszufinden:<br><br>

    <b>"SELECT t1.artikelbezeichnung, SUM(t2.bestand) AS bestand, SUM(t3.bestellt-t3.bereitsgeliefert) AS nochzuliefern FROM artikel t1 <br>
    LEFT JOIN bestand t2 ON t2.artikelnummer=t1.artikelnummer<br>
    LEFT JOIN auftragsposition t3 ON
    t3.artikelnummer=t1.artikelnummer <br>
    GROUP BY t1.artikelnummer"</b><br><br>

    In meinem aktuellen Fall habe ich 2 Datensätze für den Artikel in der Bestandstabelle und 2 Datensätze für diesen Artikel in auftragspositionen.
    <br><br>
    Im Ergebniss dieser Abfrage erhalte ich (seit ich 2 Einträge in auftragsposition habe) jeweils die doppelten Werte für "bestand" und "nochzuliefern".<br><br>

    Bin ich mit dieser Abfrage völlig auf dem Holzweg?
    <br><br>
    Als Datenbank setze ich MySQL ein.
    <br><br>
    Ich bin für jeden Tipp sehr dankbar!
    <br><br>
    ciao
    Steffen Wagner

  • #2
    Hallo,

    der Join listet alle moeglichen Kombinationen von Zeilen, die ueber die Joinbedingung erzeugt werden koennen. Hat ein Artikel zwei Bestandseintraege und zwei Auftragseintraege, gibt das also vier Zeilen und damit nicht das gewuenschte Ergebnis.

    Folgendes sollte funktionieren:

    <PRE>
    SELECT artikel.artikelnr,
    vorrat.anzahl_bestand,
    zu_liefern.anzahl_zu_liefern
    FROM (SELECT sum(bestand.bestand) as anzahl_bestand,
    artikel.artikelnummer
    FROM artikel,
    bestand
    WHERE artikel.nr = bestand.artikelnr) vorrat,
    (SELECT sum(auftragspos.bestellt - auftragspos.ausgeliefert) as anzahl_zu_liefern,
    artikel.artikelnr
    FROM artikel,
    auiftragspos
    WHERE artike.nr = auftragspos.artikelnr) zu_liefern,
    artikel
    WHERE artikel.artikelnr = bestand.artikelnr
    AND artikel.artikelnr = zu_liefern.artikelnr
    </PRE>
    Unter ORACLE kann man so formulieren, ob auch unter MySQL weiss ich nicht. Evt mit Views arbeiten. Das kann aber die Laufzeit verschlechtern.
    Oder du musst zwei SELECTS schreiben, um das Ergebnis zu bekommen.

    Wenn aussschliesslich ueber die Artikelnummer gejoint wird, werden immer alle moeglichen Kombinationen aus den Tabellen genommen. Wenn zB. ein Artikel mit verschiedenen Verfallsdaten vorhanden ist, wird das wieder das Ergebnis veraendern.

    Hoffe, mein Vorschlag hilft weiter.

    Gruss

    Stefa

    Comment


    • #3
      @Stefan, leider geht das unter MySQL so nicht (keine Subselects...)

      @Steffen

      das liegt in den zwei Einträgen in der Tabelle 'bestand'. Dadurch erhälts Du die verdoppelten Werte.
      Da MySQL keine SubSelects unterstützt, bin ich im Moment auch etwas ratlos.
      Vielleicht wäre es am einfachsten die 'verfallenen' Bestände zu löschen, so daß nur ein Eintrag pro Artikel in der Tabelle 'bestand' enthalten ist.
      Oder falls Du die alten Werte noch brauchst, fügst Du eine weitere Spalte in Bestand ein, z.B. 'aktiv', und setzt alle Einträge, außer dem gültigen auf false.

      Falls nur ein Eintrag in 'bestand' pro Artikel zu realisieren ist, sollte Dein SELECT funktionieren.
      Wenn Du den Weg über eine weitere Spalte gehst, sollte folgedner SELECT funktionieren:
      <PRE>
      SELECT
      t1.artikelnummer,
      t2.bestand, /* kein SUM hier!! */
      SUM (t3.bestellt - t3.bereitsgeliefert) AS nochzuliefern
      FROM artikel t1, bestand t2, auftragsposition t3
      WHERE (t2.artikelnummer = t1.artikelnummer)
      AND (t2.aktiv = true)
      AND (t3.artikelnummer = t1.artikelnummer)
      GROUP BY t1.artikelnummer
      </PRE>

      Da ich kein MySQL habe... (so würde es aber auf z.B. unter Paradox funktionieren)

      Viel Spaß beim tüfteln,

      Joche

      Comment


      • #4
        Hallo,

        na gut, wenn das unter MySQL so nicht geht, wuerde ich mir aus den in meinem Beispiel angegebenen SUBSelects je einen VIEW erstellen und dann diese in den JOIN einbauen.

        Man kann da ja mal ausprobieren, wie sich die Laufzeit aendert.

        Gruss

        Stefa

        Comment


        • #5
          Hallo zusammen,
          <br><br>
          erstmal vielen Dank für Eure schnelle Hilfe.
          Da bin ich wohl an die Grenzen von MySQL gestoßen. SubQuerys funktionieren erst seit der Vesrion 4.1 und die ist 'n Alpha-Release und Views gibts wohl erst ab der Version 5.1.
          <br><br>
          @Jochen<br>
          Ich kann leider nicht davon ausgehen, das nur ein Eintrag in "bestand" aktiv sein wird. Wenn Du heute im Supermarkt nach Wurst suchst, dann liegen meist auch 2 oder mehr Haltbarkeitsdaten im Regal. (blöder Vergleich, aber so ist's leider)<br><br>
          Ich werde wohl nun einzelne Querys aufsetzen und mir das Ergebniss zusammenbasteln. Ist zwar nicht schön, aber es wird funktionieren.
          <br><br>
          Vielen Dank nochmal für Eure Mühe!<br>
          ciao<br>
          Steffe

          Comment


          • #6
            Hallo nochmal,

            also versuch trotzdem mal meinen Select, allerding ohne die Zeile mit dem aktiv und doch wieder mit SUM für Bestand:
            <PRE>
            SELECT
            t1.artikelnummer,
            SUM (t2.bestand) AS gesamtbestand,
            SUM (t3.bestellt - t3.bereitsgeliefert) AS nochzuliefern
            FROM artikel t1, bestand t2, auftragsposition t3
            WHERE (t2.artikelnummer = t1.artikelnummer)
            AND (t3.artikelnummer = t1.artikelnummer)
            GROUP BY t1.artikelnummer
            </PRE>

            Bei näherer Überlegung sollte das eigentlich funktionieren, da keine Join Verbindung ausgeführt wird, sondern eine äquivalente Verbindung.

            Bitte zu berücksichtigen, daß heute Montag ist, aber ein Versuch ist es Wert...

            Das nächste große Problem bei dieser Implementierung sehe ich in der Abbuchungsroutine. Das wirst Du bei MySQL wohl im Frontend machen müssen. :c(

            cu Joche

            Comment

            Working...
            X