[NEWSboard IBMi Forum]

Hybrid View

  1. #1
    Registriert seit
    Oct 2004
    Beiträge
    251
    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.

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.695
    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

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



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


    mfg. Ludger

  4. #4
    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 ?!?!?!?

  5. #5
    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

  6. #6
    Registriert seit
    Feb 2001
    Beiträge
    20.695
    Wenn du eine 1:N-Beziehung hast, gibt es eben pro 1 Satz N Informationen.
    Wenn du eine 1:1-Beziehung hast, must du auch die Schlüssel entsprechend prüfen.
    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

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
  •