[NEWSboard IBMi Forum]
Seite 1 von 2 1 2 Letzte

Thema: Sql Rekursiv

Hybrid View

  1. #1
    Registriert seit
    Apr 2012
    Beiträge
    360
    Hallo Birgitta,

    ich habe das Sqlstatement abgesetzt:

    Code:
    Select *                            
      From BESTELLP
      Start With B1BNR02 = 7635561      
      Connect By Prior B1BNR01 = B1BNR02
      Order By Level Desc               
      Fetch First Row Only              
    
      Datum        B1NR01      B1NR02    
    1 20161123     7495368           0   
    2 20161125     7575144     7495368   
    3 20161129     7575810     7575144   
    4 20161130     7635561     7575810   
    5 20161130     7635567     7635561   
    Zurückgeliefert bekomme ich den Satz:
    Code:
    5 20161130     7635567     7635561   
    Ich hätte aber gerne den 1. Satz wo die B1NR02 = 0
    Code:
    1 20161123     7495368           0   
    Ich habe gewisse Sachen mit dem Level und MIN(B1BNR01) probiert, aber ich bekomme immer den 5.Satz(letzten) angezeigt.

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.696
    Pack das Ganze in eine Klammer:

    select * from (
    Select *
    From BESTELLP
    Start With B1BNR02 = 7635561
    Connect By Prior B1BNR01 = B1BNR02
    ) Hugo
    where BINR02 = 0


    oder

    Select *
    From BESTELLP
    Start With B1BNR02 = 7635561
    Connect By Prior B1BNR01 = B1BNR02
    Order By BINR02
    Fetch First Row Only
    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
    Apr 2012
    Beiträge
    360
    Hallo,

    ich habe alle Varianten ausprobiert, bekomme aber immer den letzten Satz geliefert.

  4. #4
    Registriert seit
    Nov 2003
    Beiträge
    2.403
    Ich hab hier was Cooles gefunden: Rekursives SQL

    Scheint ab V5R4 zu gehen ...

    PHP-Code:
    WITH ABCDE (B1NR01,DATUM,B1NR02) AS (                             
         
    SELECT B1NR01,DATUM,B1NR02 FROM BESTELLP WHERE B1NR01=7635561
         UNION ALL                                                    
         SELECT A
    .B1NR01,A.DATUM,A.B1NR02 FROM BESTELLP A             
         INNER JOIN ABCDE B ON A
    .B1NR01=B.B1NR02)                     
    SELECT FROM ABCDE WHERE B1NR02=

  5. #5
    Registriert seit
    Feb 2001
    Beiträge
    20.696
    Dies nennt sich rekursive CTE, was durch Connect By vereinfacht werden sollte.
    Ich habe leider keine vergleichbaren Daten um dieses selber zu testen.

    Warum die beiden letzten Varianten nicht funktionieren sollen, entzieht sich mir.
    Immerhin liefert doch

    Select *
    From BESTELLP
    Start With B1BNR02 = 7635561
    Connect By Prior B1BNR01 = B1BNR02

    eine Ergebnistabelle.
    Warum sollten obige 2 Varianten also immer den letzten Satz liefern?

    Mach doch mal schrittweise folgendes:

    select * from (
    Select *
    From BESTELLP
    Start With B1BNR02 = 7635561
    Connect By Prior B1BNR01 = B1BNR02
    ) hugo
    order by B1NR02

    Wenn du dass dann mit "fetch first 1 rows only" oder "where B1NR02 = 0" ergänzt sollte das gewünschte Ergebnis doch eigentlich 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

  6. #6
    Registriert seit
    Apr 2012
    Beiträge
    360
    Das rekursive CTE von Pikachu liefert das gewünscht Ergebnis(echt Cool!).

    @ Fürchau: Ich habe das Statement schrittweise auseinander genommen, aber das Ergebnis war immer der letzte Satz. ehrlich

  7. #7
    Registriert seit
    Feb 2001
    Beiträge
    20.696
    Dann wäre das ein meldenswerter Fehler an IBM, denn

    select * from (
    Select *
    From BESTELLP
    Start With B1BNR02 = 7635561
    Connect By Prior B1BNR01 = B1BNR02
    ) hugo
    where B1NR02 = 0

    hätte dann gar keine Daten liefern dürfen.
    Also irgendwas ist da faul...
    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

  8. #8
    Registriert seit
    Apr 2012
    Beiträge
    360
    Dieses Statement liefert eh keine Daten.

  9. #9
    Registriert seit
    Aug 2001
    Beiträge
    2.928
    Wenn Du schon beim START WITH die Felder (aus meinem Beispiel) austauschst, musst Du dies auch beim CONNECT BY machen bzw. den PRIOR for das andere Feld setzen.

    Das folgende Statement sollte das richtige Ergebnis liefern.
    Code:
    Select * 
      From YOURTABLE
      Start With B1BNR02 = 7635561
      Connect By Prior B1BNR02 = B1BNR01
      Order By Level Desc
      Fetch First Row Only
    Mit einer RCTE geht das natürlich auch (seit Release V5R4) ist jedoch komplizierter und weniger einfach zu verstehen.

    Birgitta
    Birgitta Hauser

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

  10. #10
    Registriert seit
    Apr 2012
    Beiträge
    360
    Danke vielmals, das war es.

  11. #11
    Registriert seit
    Feb 2001
    Beiträge
    20.696
    Bei der CTE habe ich noch die Möglichkeit das Root-Element in jeden Satz zu übernehmen.
    Geht das auch beim Connect by? Ich finde dazu nichts.
    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

  12. #12
    Registriert seit
    Aug 2001
    Beiträge
    2.928
    Mit Hilfe der Funktion Connect_By_Root bekommt man das Root-Element, das funktioniert auch korrekt bei mehreren Ausgangspunkten z.B.

    Code:
    Select Connect_By_Root(FldB), a.*
       From MyTable
       Start With FldB in ('A', 'B', 'C') Connect by Prior FldA = FldB;
    Birgitta
    Birgitta Hauser

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

Berechtigungen

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