[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Jun 2001
    Beiträge
    1.975

    sql join mit distinct o.ä.

    Moin *all
    ich habe

    select a.f1, c.f3 from datei1 a
    left outer join datei2 b on a.key1 = b.key2
    left outer join datei3 c on b.feld = c.feld

    brauche also Daten aus Datei 1 und 3
    Zur Verknüpfung von 1 und 3 muss ich über datei2 gehen.

    Diese hat aber ab und an mehrere Sätze die zu Datei1 passen.
    Wie kann ich die Verknüpfung auf einen Satz reduzieren
    Es ist 100% sicher, das FELD in allen Datensäzen eine Gruppe in datei 2 immer gleich ist.
    Bsp

    PHP-Code:
    Datei 1,       key1                   Feld           F3
                     11111111
                     22222222
                     33333333
    Datei 2        11111111              A               
                      33333333             B 
                      33333333             B 
    Datei 3
                                                 A              5
                                                 B              7
      
    Soll Ergebnis 11111111 5
                      22222222
                      33333333 7

    ist Ergebnis  11111111 5
                      22222222
                      33333333 7  
                      33333333 7 
    Einer ne Idee?

    Danke
    Gruß
    Robi
    Das Notwendige steht über dem technisch machbaren.
    (klingt komisch, funktioniert aber!)

  2. #2
    Registriert seit
    Jun 2001
    Beiträge
    1.975
    Ich hab es erstmal so gelöst, aber gibt es nix besseres?

    with x as (select distinct key2, feld from datei2)
    select a.f1, c.f3 from datei1 a
    left outer join x on a.key1 = x.key2
    left outer join datei3 c on x.feld = c.feld

    Danke
    Das Notwendige steht über dem technisch machbaren.
    (klingt komisch, funktioniert aber!)

  3. #3
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Nö, nur andere Schreibweisen:

    left join (select key2, min(Feld) feld from datei2 Group by key2) on key1=key2

    Könnte ggf. schneller sein.

    Nächste Alternative:
    with x as (
    select f1, f3
    , (select Feld from datei2 where key1 = key2 fetch first 1 rows only) feld
    from date1)

    select * from x
    left join datei3 c on x.feld = c.Feld

    Falls bei dir der Fetch first an dieser Stelle noch nicht geht (ab V6), dann hilft hier ggf. ein Distinct oder Min(), falls "Feld" nicht eindeutig.
    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
    Aug 2001
    Beiträge
    2.873
    Vielleicht sehe ich das Problem nicht, aber warum machst du nicht einfach einen SELECT DISTINCT?

    Code:
    select DISTINCT a.f1, c.f3 from datei1 a
    left outer join datei2 b on a.key1 = b.key2
    left outer join datei3 c on b.feld = c.feld
    Perfomancemäßig könnte es sein, dass die Variante mit der Common Table Expression bzw. dem verschachtelten Sub-Select in der From-Anweisung ein schnelleres Ergebnis liefern.
    Das müsste man über Visual Explain analysieren.

    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

  5. #5
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Meine Erfahrung zu Distinct ist eher eine Verlangsamung, da ja alle Daten gelesen werden müssen.
    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
    Aug 2001
    Beiträge
    2.873
    Zitat Zitat von Fuerchau Beitrag anzeigen
    ... da ja alle Daten gelesen werden müssen.
    Noch nicht mal in alter Zeit (allenfalls in ganz alter Zeit so Release 4) war das so, dass beim Distinct alle Daten gelesen werden müssen.
    Dass die Daten komplett gelesen werden müssen, ist entweder eine Vermutung oder eine falsche Indexing Strategy.

    Mit dem richtigen Index kann ein IOA (Index Only Access) mit Index-Probe (bzw. CQE Index Key Positioning) oder notfalls Index-Scan erfolgen.

    Ohne genaue Analyse kann man nicht mehr sagen .
    ... Ich hatte ja auch "könnte" und außerdem "analysieren" geschrieben!

    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

Similar Threads

  1. SQL mit Update + Join
    By Harald.Wallukat in forum IBM i Hauptforum
    Antworten: 10
    Letzter Beitrag: 06-12-13, 09:37
  2. LEFT OUTER JOIN
    By GS in forum IBM i Hauptforum
    Antworten: 3
    Letzter Beitrag: 21-11-02, 08:51
  3. Join File
    By muadeep in forum IBM i Hauptforum
    Antworten: 8
    Letzter Beitrag: 05-07-02, 10:37
  4. Join-Files optimieren
    By KB in forum IBM i Hauptforum
    Antworten: 2
    Letzter Beitrag: 01-08-01, 09:28
  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
  •