[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Mar 2010
    Beiträge
    29

    Unhappy Sql will nicht so wie ich

    Ich habe eín kleines Programm in Vb entwickelt in dem ich über Sql Abfragen auf die AS 400 Tabellen zugriff habe. Nun habe ich 3 Tabellen, aus denen ich Sendungsnummern, Preise und Nebenkosten selektieren möchte.
    Select A.ARSN, Sum(B.ARFB + B.ARMB + B.ARRBEM ) as Preis, Sum(C.ARNBS) as Nebenkosten
    From From TM.AUHD0P as A Join TM.AUS2BP as B on A.ARSN = B.ARSN Left JOIN TM.AUS3NP as C on a.ARSN = C.ARSN
    where A.ARDTEF BETWEEN " & datvon & " and " & datbis & " and A.ARNL = 88 and b.ARNL = 88 and A.ARTARN IN '" & art & "'
    And (NOT(C.ARNBS = 199))And B.ARTEIL IN ( 'K',' ' ) And C.ARTEIL IN ( 'K',' ')
    Wenn nun aber manche Datensätze keine Nebenkosten besitzen (C....) gibt es diesen Datensatz in der Tab C nicht und der gesamte Datensatz wird nicht angzeigt.
    Ich möchte aber die Kosten auch für die Sätze haben in denen keine Nebenkosten enthalten sind.
    Wie kann ich das umsetzen? Weiss jemand Rat?

  2. #2
    Registriert seit
    Aug 2003
    Beiträge
    1.508

  3. #3
    Registriert seit
    Nov 2003
    Beiträge
    2.307
    Die Bedingungen für B und C dürfen nicht in WHERE-Klausel, sondern müssen in die ON-Klauseln. Und dann brauchst du vermutlich teilweise noch VALUE() oder COALESCE() für die Spalten aus B und C, da auch NULL-Werte anstelle von numerischen Werten kommen können.

  4. #4
    Registriert seit
    Aug 2001
    Beiträge
    2.873
    Ein LEFT OUTER-Join ist vorhanden und die Verknüpfung sieht auch ordentlich aus, aber...

    In der Where-Bedingung werden nur Datenstätze berücksichtigt, mit C.ARTEIL IN ('K', ' '). Wenn jetzt kein Datensatz für die Nebenkosten gefunden wird, ist C.ARTEIL = NULL und wird damit nicht selektiert.

    Bei (NOT(C.ARNBS = 199)) dürfte es keine Probleme geben, da nur Datensätze die nicht 199 sind ausgewählt werden. (Ich würde die Schreibweise: C.ARNBS <> 199 oder C.ARNBS != 199 bevorzugen.

    Du musst also Deine Where-Bedingung wie folgt erweitern:

    Code:
    ... and (C.ARTEIL ('K', ' ') or C.ARTEIL is NULL)
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 4. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  5. #5
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Select A.ARSN, Sum(B.ARFB + B.ARMB + B.ARRBEM ) as Preis, Sum(C.ARNBS) as Nebenkosten
    From
    TM.AUHD0P as A
    left Join TM.AUS2BP as B on A.ARSN = B.ARSN
    Left JOIN TM.AUS3NP as C on a.ARSN = C.ARSN
    where A.ARDTEF BETWEEN " & datvon & " and " & datbis & " and A.ARNL = 88 and (b.ARNL = 88 or b.ARNL is null) and A.ARTARN IN '" & art & "'
    And ((NOT(C.ARNBS = 199) or c.arnbs is null))And (B.ARTEIL IN ( 'K',' ' ) or b.ARTEIL is null) And (C.ARTEIL IN ( 'K',' ') or c.ARTEIL is null)

    Das Problem ist generell, dass Where-bedingungen auf Left-Join-Felder automatisch einen Inner-Join daraus machen.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  6. #6
    Registriert seit
    Mar 2010
    Beiträge
    29

    Question

    Klasse! So weit so gut.
    Aber was ist wenn jetzt
    C.ARTEIL IN ('K') = True aber
    in diesem Datensatz auch
    C.ARNBS = 199
    Dann ist weder C.ARTEIL noch
    C.ARNBS is null.
    aber durch
    NOT (C.ARNBS = 199
    wird dieser Datensatz vernachlässigt.

    Denk ich zu kompliziert!?

  7. #7
    Registriert seit
    Nov 2003
    Beiträge
    2.307
    Probier doch mal das And (NOT(C.ARNBS = 199)) und das And C.ARTEIL IN ( 'K',' ') direkt hinter das on a.ARSN = C.ARSN zu setzen.

  8. #8
    Registriert seit
    Mar 2010
    Beiträge
    29

    Problem besteht

    Habe das Problem, daß die Datensätze
    die in Tabelle C in ARTEIL = U haben, durch "C.ARTEIL IN ('K')" in "WHERE"
    nicht angezeigt werden.
    Aber sie sind auch nicht null also trifft "c.ARTEIL is null" auch nicht zu. 'Wie kann ich diese Datensätze die Umsätze in TAB A und B haben anzeigen.
    Die Abfrage müsste also trotz das in C nicht Verwertbares gefunden wird Einträge aus TAB A und B anzeigen.



  9. #9
    Registriert seit
    Nov 2003
    Beiträge
    2.307
    Schon mal so probiert?
    Zitat Zitat von Pikachu Beitrag anzeigen
    Probier doch mal das And (NOT(C.ARNBS = 199)) und das And C.ARTEIL IN ( 'K',' ') direkt hinter das on a.ARSN = C.ARSN zu setzen.

  10. #10
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Nun, wenn du Daten aus 2 Tabellen und/oder haben möchtest, geht das eigentlich nicht per Join.
    Beim Join hast du eine Primary und Secondaries, was du in der Primary nicht hast kannst du also in der Secondary auch nicht finden.

    Dies ist ein klassischer Fall von UNION:

    select f1, f2, f3, ... from TabA
    [left] join ...
    where ...
    union [ALL]
    select f1, f2, f3, ... from TabB
    [left] join ...
    where ...
    order by ...

    Wichtig ist ggf. "union all", da ansonsten identische Sätze wie bei "select distinct ..." ausgefiltert werden.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  11. #11
    Registriert seit
    Mar 2010
    Beiträge
    29
    Läuft....
    Obwohl mir nicht richtig klar ist, warum Einschränkung hinter "on" anders reagiert wie in der WHERE Klausel
    Danke!

  12. #12
    Registriert seit
    Nov 2003
    Beiträge
    2.307
    Die Einschränkungen hinter ON gelten nur für die Auswahl der Datensätze der jeweils verknüpften Tabelle. Falls keine passenden Datensätze gefunden werden, wird bei einem LEFT OUTER JOIN ein Datensatz mit NULL-Werten in allen Spalten angenommen bzw. zurückgegeben. Die Einschränkungen hinter WHERE beziehen sich dagegen auf die ermittelten Daten aus den angegebenen Tabellen.

Similar Threads

  1. RPGLE - SQL
    By christian_lettner in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 16-11-06, 10:15
  2. SQL - Cursor vernichten ?!?
    By FNeurieser in forum NEWSboard Programmierung
    Antworten: 3
    Letzter Beitrag: 11-10-06, 14:53
  3. SQL und OBJLCK
    By malzusrex in forum IBM i Hauptforum
    Antworten: 8
    Letzter Beitrag: 19-09-06, 11:04
  4. SQL - Fehler
    By Kaufmann in forum IBM i Hauptforum
    Antworten: 11
    Letzter Beitrag: 28-06-06, 14:11
  5. SQL .. for update of (RPG embedded SQL)
    By loeweadolf in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 01-06-06, 09:43

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • You may not post attachments
  • You may not edit your posts
  •