[NEWSboard IBMi Forum]
Seite 1 von 2 1 2 Letzte
  1. #1
    Registriert seit
    Aug 2001
    Beiträge
    309

    sql mit 3 Dateien

    Hallo

    will/muß per SQL eine Abfrage erstellen!

    Anzeigedaten (Felder) für diese Abfrage kommen aus drei verschiedenen Dateien!

    a.) BESTXXC
    b.) TSSXX
    c.) WARKTOXX

    Für zwei Dateien funkt die Abfrage in etwa so:
    SELECT a.lbtnr, a.lblief, a.lbramp, b.artbz, a.lbbet§, a.benumm
    from yyy/BESTXXC a left join xxx/TSSXX b on (a.lbtnr =
    b.artnr) order by a.lbtnr

    will ich jetzt noch ein Feld (AKDATU) aus der dritten Datei (WARKTOXX) mit anzeigen, habe ich damit Probleme!

    Verknüpfungsfelder aus Datei "a" und "c" sind:
    a.BENUMM -> c.AUFKTO
    a.BEPOS -> c.BELPOS

    Wie muß ich das in der SELECT-Anweisung angeben, damit ich zu einem (richtigen) Ergebniss komme?

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    SELECT a.lbtnr, a.lblief, a.lbramp, b.artbz, a.lbbet§, a.benumm
    from yyy/BESTXXC a
    left join xxx/TSSXX b on a.lbtnr = b.artnr
    left join xxx/WARKTOXX c on a.BENUMM = c.AUFKTO and a.BEPOS = c.BELPOS
    order by a.lbtnr

    der Join ist wie bei einer Where-Klausel zu definieren, Klammern werden nicht benötigt.
    Du kannst das auch als Where definieren, dann ist es automatisch ein "inner join".

    Du solltest dich auch entscheiden ob inner oder left, bei inner können NULL-Werte kommen.
    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

  3. #3
    Registriert seit
    Aug 2001
    Beiträge
    2.873
    Wie wär's damit:
    PHP-Code:
    SELECT a.lbtnra.lbliefa.lbrampb.artbza.lbbet§a.benummc.AKDATU
      from    yyy
    /BESTXXC a left join xxx/TSSXX b 
           on a
    .lbtnr b.artnr
                                 join MySchema
    /WARKTOXX c
           on     a
    .BENUMM c.AUFKTO
              
    and a.BEPOS  c.BELPOS
    order by a
    .lbtnr 
    Birgitta
    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

  4. #4
    Registriert seit
    Aug 2001
    Beiträge
    309
    wenn ich folgende Anweisung benutzte:

    SELECT a.lbtnr, a.lblief, a.lbramp, b.artbz, a.lbbet§, a.benumm, c.a
    kdatu from yyy/bestxxc a left join xxx/tssxx b on a.lbtnr = b.a
    rtnr join xxx/warktoxx c on a.benumm = c.aufkto and a.bepos = c.belpos order by a.lbtnr

    dann bekomme ich nach einer etwas längeren Wartezeit diese
    SQL-Fehlermeldung:

    Zeichen in CAST-Argument ungültig

  5. #5
    Registriert seit
    Aug 2001
    Beiträge
    309
    Zusatz:

    Habe gerade festgestellt, das die beiden Felder a.BEPOS & c.BELPOS einmal num. (3,0) u. das andere char (3) ist !!!!!!!


    kann es vieleicht daran liegen!

    Fals ja, wie kann ich dieses Problem umgehen?

  6. #6
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Ja, mit casting:
    digits(a.bepos) = c.belpos
    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

  7. #7
    Registriert seit
    Aug 2001
    Beiträge
    309
    BINGO !!! -> dankeschön !!!

    Wenn ich aber jetzt alle Sätze haben will (auch die, die nicht in
    der zweiten bzw. dritten Datei eine entsprechendes "Gegenstück" haben)!

    Wie wie muß ich das dann machen?


    Mir ist leider immer noch nicht der Unterschied zwischen:
    - join,
    - left join,
    - etc.

    klar !!!!!!!

    Kann mir jemand dazu vieliecht mal ne kurze "Hilfestellung" geben? (danke)

  8. #8
    Registriert seit
    Oct 2004
    Beiträge
    240
    Zitat Zitat von Fuerchau
    Du solltest dich auch entscheiden ob inner oder left, bei inner können NULL-Werte kommen.
    Räusper...Es ist genau anders herum...

    Zitat Zitat von muadeep
    BINGO !!! -> Mir ist leider immer noch nicht der Unterschied zwischen:
    - join,
    - left join,
    - etc.

    klar !!!!!!!

    Kann mir jemand dazu vieliecht mal ne kurze "Hilfestellung" geben? (danke)
    Ich mach mal ein paar Beispiele:

    Datei Auftrag
    AufNr KunNr Bstnr .....
    1 10 b4711
    2 11 b4712
    3 12 b4713

    Datei Liefadr (abweichende Lieferadresse)

    AufNr Adresse
    2 Wien

    Kunden
    Nr Name Adresse
    10 Maier Graz
    11 Hofer Linz
    12 Schmidt München

    Anforderung: Liste alle Aufträge mit der tatsächlichen Lieferadresse:

    Der Klassiker:
    PHP-Code:
    select from AuftragLiefAdrKunden where Auftrag.AufNr  LiefAdr.Aufnr and Auftrag.KunNr Kunden.Nr 
    würde nur liefern:
    PHP-Code:
    Aufnr KunNr ... Liefadr.... Name Kunden.Adressse
    2      11        Wien       Hofer    Linz 
    Dieser Select entspricht einem inner Join und könnte auch so geschrieben werden:

    PHP-Code:
    select from Auftrag 
     inner join LiefAdr on Auftrag
    .Aufnr 
     inner join Kunden  on Auftrag
    .KunNr Kunden.Nr 
    Das Ergebnis wäre das Gleiche.

    Ein Inner Join liefert nur dann einen Eintrag, wenn die Verknüpfung erfüllt ist.


    Besser für diesen Fall: der LEFT OUTER JOIN

    PHP-Code:
    select from Auftrag 
     LEFT OUTER join LiefAdr on Auftrag
    .Aufnr 
     LEFT OUTER join Kunden  on Auftrag
    .KunNr Kunden.Nr 
    würde liefern:

    PHP-Code:
    Aufnr KunNr ... Liefadr.... Name Kunden.Adressse
    1      10          
    -        Maier     Graz
    2      11        Wien       Hofer     Linz
    3      12          
    -        Schmidt   München 
    Für die Darstellung von Null wird "-" verwendet.

    Es geht aber besser:
    PHP-Code:
    select Auftrag.AufnrAuftrag.KunNr
     
    coalesce(Liefadr.AdresseKunden.Adresse) as AdresseName
     
    from Auftrag 
     LEFT OUTER join LiefAdr on Auftrag
    .Aufnr 
     LEFT OUTER join Kunden  on Auftrag
    .KunNr Kunden.Nr 
    Liefert:
    PHP-Code:
    Aufnr KunNr ... Adresse.... Name 
    1      10        Graz       Maier     
    2      11        Wien       Hofer     
    3      12        München    Schmidt 
    Die Definition von coalesce (IBM-Welt value) lautet:
    Liefert den erten Wert zurück, der nicht Null ist. Man könnte also die Null-Behandlung auch mit
    coalesce(Liefadr.Adresse, ' ') as Adresse umgehen.

    Bliebe noch der letzte Join, der Outer bzw. Exception Join:
    Liefert nur Sätze von nicht erfolgreichen Verknüfpung zurück.

    PHP-Code:
    select from Auftrag 
     exception join LiefAdr on Auftrag
    .Aufnr LiefAdr.Aufnr 
    Würde die Aufträge 1 und 3 liefern, da es hier keine LiefAdr gibt.

  9. #9
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Entschuldige, man kann sich ja mal vertun (tippfehler), aber es ist immer gut, weitere Fachleute zu haben.
    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

  10. #10
    Registriert seit
    Jul 2003
    Beiträge
    331
    Hier eine kleine Übersicht über Jpins:



    http://www.muhmann.de/doku/1138725058sql_join.doc


    mfg. Ludger

  11. #11
    Registriert seit
    Aug 2001
    Beiträge
    309
    meine SQL - Anweisung müsste dann in etwa so lauten (denke ich mal):

    PHP-Code:
    SELECT
    a
    .LBTNRa.LBLIEFa.LBRAMPb.ARTBZa.LBBET§a.BENUMMc.AKDATU
    FROM yyy
    /BESTXXC a
    LEFT OUTER JOIN xxx
    /TSSXX b ON  a.LBTNR b.ARTNR
    LEFT OUTER JOIN xxx
    /WARKTOXX c ON a.BENUMM c.AUFKTO AND DIGITS(a.BEPOS) = c.BELPOS
    ORDER BY a
    .LBTNR 
    Mit dieser Anweisung erhalte ich dann aber "33266"-Sätze
    -> in der Datei (a) BESTMXXC sind aber nur "32781"

    woher kommen dann die zusätzlich 485 Sätze ?!?!?!?

  12. #12
    Registriert seit
    Oct 2003
    Beiträge
    192
    Sind vielleicht in einer der left join dateien für den Zugriffsschlüssel mehr als 1 Satz vorhanden ?

    Z.b.
    1 Header Satz mit 3 Detail Sätzen per left join verknüpft = 3 Sätze, obwohl im Header nur 1 Satz ist.


    Ansonsten kann man sich die joins übrigens auch sehr gut als Schnittmenge vorstellen...

    A Inner join B = Element ist in A und B vorhanden

    A left join B = Element ist in A, wenn es in B vorhanden ist wird b mitselektiert, sonst kommen NULL Werte

    A Exception Join B = Element ist in A aber nicht in B


    Gruß
    Rince

Similar Threads

  1. SQL Update aus zwei Dateien mit 3 Schlüsselfeldern
    By mk in forum NEWSboard Programmierung
    Antworten: 13
    Letzter Beitrag: 13-07-12, 08:53
  2. SQL Update 2 Dateien
    By moskito in forum NEWSboard Programmierung
    Antworten: 5
    Letzter Beitrag: 30-08-06, 17:30
  3. SQL Case von mehreren Dateien
    By steven_r in forum NEWSboard Programmierung
    Antworten: 4
    Letzter Beitrag: 08-08-06, 09:34
  4. SQL UPDATE, verknüpfung zweier Dateien
    By desti82 in forum IBM i Hauptforum
    Antworten: 2
    Letzter Beitrag: 04-07-06, 15:25
  5. SQL über 168 Dateien
    By mikex01 in forum IBM i Hauptforum
    Antworten: 5
    Letzter Beitrag: 21-04-06, 16:11

Berechtigungen

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