[NEWSboard IBMi Forum]
Seite 1 von 2 1 2 Letzte
  1. #1
    Registriert seit
    Nov 2009
    Beiträge
    208

    sql left outer join

    Guten Morgen,

    Ich habe eine führende Datei A und eine "nicht immer vorhandene" Datei B

    Leider gibt es Fälle in denen der Key in Datei B doppelt vorhanden ist.

    Bei 10 Sätzen in Datei A bekomme ich 12 Sätze durch den select, obwohl mit dem Key aus Datei A nur 7 passende Sätze in Datei B sind. Diese aber mehrfach.

    select * from DateiA left outer join DateiB on a.key = b.key

    ich möchte quasi ein

    select * from DateiA left outer join DateiB on a.key = max(b.key) group by b.key
    Das geht aber nicht.

    Wer kann mir helfen,
    Danke!

  2. #2
    Registriert seit
    Aug 2003
    Beiträge
    1.508
    Du müsstest dafür ein Subselect von DateiB machen ...

    [CODE]With B as (Select Key, Feld1, Feld2, ... from DateiB Groupb By Key)
    Select * From from DateiA a left outer join B on a.key = b.key[/CODE

    lg Andreas

  3. #3
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Wenn a.key = b.key dann ist a.key = max(b.key)!
    Das hilft dir so also nicht.
    Du benötigst ein zusätzliches Kriterium um den letzten Satz aus DateiB zu ermitteln.
    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

  4. #4
    Registriert seit
    Dec 2004
    Beiträge
    203
    Hallo.
    An die SQL Profis :
    wäre das nicht mal was für
    FETCH FIRST 1 ROWS ONLY
    Gruß,
    Ralf

  5. #5
    Registriert seit
    Dec 2014
    Beiträge
    310
    Wenn Du kein zusätzliches Kriterium hast, dann kannst Du Dir mit der RRN behelfen:

    select * from DateiA a left join DateiB b on a.feld1=b.feld1
    where rrn(b) in (select max(rrn(DateiB)) from DateiB group by feld1)
    or rrn(b) is null

  6. #6
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Für rrn(x) existiert glaube ich erst ab V7R1 ein Pseudoindex, ansonsten kann das langsam sein.
    "Fetch first 1 rows only" klappt im skalaren Subselect.
    Ob das auch im "Left Join (select * from file fetch first 1 records only) b on a.key = b.key" sinn macht, wage ich zu bezweifeln.
    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
    Nov 2009
    Beiträge
    208
    erst mal vielen Dank

    ich habe nun diese Version, gewählt
    select * from DateiA A left outer join (select distict f1, f2, f3, ... from DateiB) B on A.key = B.key

    das funktioniert richtig

    Danke
    Gruß
    DiBe

  8. #8
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Das ist eher unüblich und würde bedeuten, dass du in DateiB vollkommen doppelte Daten hast.
    Außerdem ist dies nun nicht besonders schnell, da du Indexzugriffe auf DateiB ggf. verhinderst.
    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

  9. #9
    Registriert seit
    Nov 2009
    Beiträge
    208
    Nun ja, bis auf die letzten 4 Felder (die mich nicht interessieren) sind in der Datei tatsächlich alle gleich.
    Performance spielt hier nicht die Rolle, eher die Lösung an sich ...

  10. #10
    Registriert seit
    Aug 2006
    Beiträge
    2.077
    Hallo *all,
    wer zerschlägt dann mal den gordischen Knoten in meinem neuronalen Netz.

    Habe hier einen Kundenstamm und dazu eine Auftragsdatei.
    Ich möchte jetzt zu der Auftragsdatei jeweils den letzten Auftragssatz nach Datum haben.


    Abfrage:

    Code:
    select t01.adkto, max(t02.akkdtl), t02.akanr from               
     adr01pf t01 left join ako01pf  t02                 
                on t01.adkto = t02.akkto                
             where adfa  = 1                            
               and adsts = 0                            
               and akkdj1 = 1                           
               and (akkdtl > 150101 and akkdtl < 990000)
               group by adkto, akanr, akkdtl            
               order by adkto, akkdtl
    Ergebnis:
    nummer Nr.
    Code:
      1001      150.422     149326  
      1001      150.914     150209  
      1006      150.128     563217  
      1006      150.428     563933  
      1009      151.008     564651
    Aber irgendwas ist ja noch falsch, sonst würde die Kunden 1001 nicht zweimal auftauchen.

  11. #11
    Registriert seit
    Jan 2007
    Beiträge
    905
    is ja klar, wenn du auch noch nach Auftragsnummer gruppierst
    kf

  12. #12
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    select t01.adkto, max(t02.akkdtl), t02.akanr ...
    group by adkto, akanr, akkdtl
    Aggregate sind Ergebnisfelder der Gruppierung.
    Gruppierst du auf Aggregaten kannst du das Aggregat auch gleich weglassen.

    Fluch der Erlaubnis, dass auf nicht selektierten Felder gruppiert und sortiert werden darf.
    Früher wäre der group by akkdtl abgewiesen worden da dieser nicht selektiert sondern im Aggregat verwendet wird.
    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. Left join Verständnis Frage
    By KingofKning in forum NEWSboard Programmierung
    Antworten: 10
    Letzter Beitrag: 17-11-14, 14:52
  2. SQL mit Update + Join
    By Harald.Wallukat in forum IBM i Hauptforum
    Antworten: 10
    Letzter Beitrag: 06-12-13, 09:37
  3. LEFT OUTER JOIN
    By GS in forum IBM i Hauptforum
    Antworten: 3
    Letzter Beitrag: 21-11-02, 08:51
  4. Join File
    By muadeep in forum IBM i Hauptforum
    Antworten: 8
    Letzter Beitrag: 05-07-02, 10:37
  5. SQL und AS/400 JOIN
    By HoScHiE in forum IBM i Hauptforum
    Antworten: 4
    Letzter Beitrag: 11-07-01, 07:57

Berechtigungen

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