Margin-Auto: LEFT JOIN in Access

Hi,

ich habe eine Datenbank mit drei Tabellen: Verkaufsvorgänge, Standort und Artikel. Zu jedem Verkaufsvorgang gehört genau ein Artikel und genau ein Standort. Umgekehrt gehören zu jedem Standort n Verkaufsvorgänge und zu jedem Artikel ebenso m Verkaufsvorgänge.

Ich möchte nun eine Liste mit allen Standorten, die weniger als 10 EUR Umsatz gemacht haben, wobei sich der Umsatz aus der Anzahl der verkauften Artikel (Tabelle Verkaufsvorgänge) und dem Einzelpreis (aus der Tabelle Artikel) errechnet. Wichtig ist dabei, dass auch die Standorte mit auftauchen, für die keine Verkaufsvorgänge vorliegen.

Mein Ansatz:

SELECT Standort.Name, Sum(Verkaufsvorgaenge.Anzahl*Artikel.Einzelpreis) AS Umsatz  
FROM Standorte LEFT JOIN (Artikel INNER JOIN Verkaufsvorgaenge ON Artikel.Artikelnummer = Verkaufsvorgaenge.Artikel) ON Standort.StandortNummer = Verkaufsvorgaenge.Standort  
GROUP BY Standort.Name  
HAVING (Sum(Verkaufsvorgaenge.Anzahl*Artikel.Einzelpreis)<10);

Access quittiert mir dieses Begehr nun mit der Fehlermeldung "Die SQL-Anweisung konnte nicht ausgeführt werden, da sie mehrdeutige Inklusionsverknüpfungen enthält. Damit eine der Verknüpfungen zuerst ausgeführt wird, müssen Sie eine separate Abfrage erstellen, die die erste Verknüpfung ausführt, und dann die Abfrage in die SQL-Anweisung einschließen.

Was mache ich falsch und wie ginge es richtig?

TIA

Margin-Auto

  1. yo,

    ich kenne mich mit jet-engine von Access nicht besonders gut aus, bzw. ich mag sie überhaupt nicht. aber kannst du dort nicht auch standard sql eingeben indem du auf diesen kleine SQL button drückst beim erstellen von abfragen ?

    des weiteren hilft es aliasnamen zu verwenden und auch zu beachten, dass dein prüfung in der HAVING klausel nicht NULL Werte berücksichtig

    SELECT s.Name, Sum(v.Anzahl * a.Einzelpreis) AS Umsatz
    FROM Standorte s
    LEFT JOIN Verkaufsvorgaenge v ON s.StandortNummer = v.Standort
    LEFT JOIN Artikel a ON a.Artikelnummer = a.Artikel
    GROUP BY s.Name
    HAVING Sum(v.Anzahl * a.Einzelpreis) < 10 OR Sum(v.Anzahl * a.Einzelpreis) IS NULL
    ;

    Ilja

    1. Hi,

      Danke für die Hilfe.

      standard sql eingeben indem du auf diesen kleine SQL button drückst beim erstellen von abfragen ?

      Ja, man kann das SQL zu Abfragen auch manuell eingeben. Das ist es ja, was ich versuche, nachdem die "Entwurfsansicht" zum Zusammenklicken der Abfrage versagt hat. Oder was meisnt du damit?

      des weiteren hilft es aliasnamen zu verwenden

      ...für die Access ein AS will: FROM Standorte AS s.

      dein prüfung in der HAVING klausel nicht NULL Werte berücksichtig

      Richtig, danke für den Hinweis. Ich habe beim Rumprobieren das HAVING rausgenommen, weil ich erst einmal die Abfrage an sich zusammenbekommen wollte, bevor ich die Selektion einfüge.

      SELECT s.Name, Sum(v.Anzahl * a.Einzelpreis) AS Umsatz
      FROM Standorte s
      LEFT JOIN Verkaufsvorgaenge v ON s.StandortNummer = v.Standort
      LEFT JOIN Artikel a ON a.Artikelnummer = a.Artikel
      GROUP BY s.Name
      HAVING Sum(v.Anzahl * a.Einzelpreis) < 10 OR Sum(v.Anzahl * a.Einzelpreis) IS NULL

      Das führt zu folgender Fehlermeldung "Syntaxfehler (fehlender Operator) in Abfrageausdruck 'Verkaufsvorgaenge v ON s.StandortNummer = v.Standort LEFT JOIN Artikel a ON a.Artikelnummer = a.Artikel'"
      Offenbar kann man die beiden LEFT JOINs nicht direkt hintereinander hängen. Muss ich sie klammern? Wenn ja, wie?

      TIA

      Margin-Auto

      1. yo,

        ...für die Access ein AS will: FROM Standorte AS s.

        das AS würde ich immer weglassen, sofern Access deswegen nicht meckert.

        Das führt zu folgender Fehlermeldung "Syntaxfehler (fehlender Operator) in Abfrageausdruck 'Verkaufsvorgaenge v ON s.StandortNummer = v.Standort LEFT JOIN Artikel a ON a.Artikelnummer = a.Artikel'"

        da habe ich auch ein aliasname durcheinander gebracht. es muss in der zweiten ON Klausel heisen: ON a.Artikelnummer = v.Artikel, aber das wird wohl nicht die fehlermeldung ausmachen.

        Offenbar kann man die beiden LEFT JOINs nicht direkt hintereinander hängen. Muss ich sie klammern? Wenn ja, wie?

        wie egsagt, ich kann die jet-engine überhaupt nicht leiden. aber versuch doch mal die drei tabellen per "Clicky-Clicky" mit einander in OUTER JOINS zu verbinden, das sollte auch gehen und dir dann das SQL anschauen, das er gebastelt hat, um es dann für dich anzupassen.

        Ilja

        1. Hi,

          da habe ich auch ein aliasname durcheinander gebracht. es muss in der zweiten ON Klausel heisen: ON a.Artikelnummer = v.Artikel, aber das wird wohl nicht die fehlermeldung ausmachen.

          Das hatte ich bereits beim Übersetzen in die "richtigen" Tabellennamen korrigiert ;-)

          wie egsagt, ich kann die jet-engine überhaupt nicht leiden.

          Wenn du meinen Chef überredest, eine andere Datenbank anzuschaffen und mir eine Schulung spendierst, dass ich das Projekt - wie geplant - bis Ende der Woche hinbekomme, können wir über Alternativen reden. ;-)

          aber versuch doch mal die drei tabellen per "Clicky-Clicky" mit einander in OUTER JOINS zu verbinden, das sollte auch gehen und dir dann das SQL anschauen, das er gebastelt hat, um es dann für dich anzupassen.

          Genau das hatte ich eingangs gemacht und die Fehlermeldung "Die SQL-Anweisung konnte nicht ausgeführt werden, da sie mehrdeutige Inklusionsverknüpfungen enthält. Damit eine der Verknüpfungen zuerst ausgeführt wird, müssen Sie eine separate Abfrage erstellen, die die erste Verknüpfung ausführt, und dann die Abfrage in die SQL-Anweisung einschließen." erhalten, sobald ich die Verknüpfung so ändere, dass auch die Standorte enthalten sind, auf die keine Verkäufe entfallen.

          Margin-Auto

          1. yo,

            Wenn du meinen Chef überredest, eine andere Datenbank anzuschaffen und mir eine Schulung spendierst, dass ich das Projekt - wie geplant - bis Ende der Woche hinbekomme, können wir über Alternativen reden. ;-)

            nun hast du ja gute argumente, deinem chef klar zu machen, dass die jet-engine schrott ist...

            Genau das hatte ich eingangs gemacht und die Fehlermeldung "Die SQL-Anweisung konnte nicht ausgeführt werden, da sie mehrdeutige Inklusionsverknüpfungen enthält. Damit eine der Verknüpfungen zuerst ausgeführt wird, müssen Sie eine separate Abfrage erstellen, die die erste Verknüpfung ausführt, und dann die Abfrage in die SQL-Anweisung einschließen." erhalten, sobald ich die Verknüpfung so ändere, dass auch die Standorte enthalten sind, auf die keine Verkäufe entfallen.

            du meinst die clicky-cliky abfrage hat schon nicht funktioniert ? ich habe access hier, könnte es mal selbst ausprobieren.

            Ilja

          2. Hallo,

            Genau das hatte ich eingangs gemacht und die Fehlermeldung

            "Die SQL-Anweisung konnte nicht ausgeführt werden, da sie mehrdeutige Inklusionsverknüpfungen enthält. Damit eine der Verknüpfungen zuerst ausgeführt wird, müssen Sie eine separate Abfrage erstellen, die die erste Verknüpfung ausführt, und dann die Abfrage in die SQL-Anweisung einschließen."

            eine Fehlermeldung, die Dir exakt sagt, was Du zu tun hast:

            Erstelle eine gespeicherte Auswahlabfrage (was man sonst View nennt) für die "innere" Abfrage und erstelle eine Abfrage auf den Join von erster Tabelle und diesem View.

            Es ist meist eine gute Idee, den Vorschlägen einer Fehlermeldung zu folgen.

            Und ja: wie jedes andere DBMS auch, benötigt man selbstverständlich auch für MS Access und seinen Funktionsumfang (der nicht zu unterschätzen ist) eine Einarbeitungszeit. Das klickt sich nicht von selbst :-)

            Freundliche Grüße

            Vinzenz