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

Thema: Sql Rekursiv

Hybrid View

  1. #1
    Registriert seit
    Apr 2012
    Beiträge
    360

    Sql Rekursiv

    Hallo,

    ich habe eine Bestelldatei(BESTELLP) die 2 relevante Felder(B1NR01, B1NR02) für mich hat.
    Der Key von der Datei BESTELLP ist B1NR01.

    Falls das Feld B1NR02 befüllt ist, müsste ich mit dieser Nummer so lange lesen bis in diesem Feld Null steht.
    Das wäre dann die Orginal-Bestellung mit der ich weiterarbeiten muss.

    Bis jetzt wurde das im Rpg so abgebildet
    Code:
    IF B1NR02 <> 0;                                                            
      DOW B1NR02 <> 0;                                                         
        CHAIN(N) B1NR02 BESTELLP;  // Key ist B1NR01                                             
        IF NOT %FOUND;
          LEAVE;                                                    
      ENDDO;                                                                                                                      
    ENDIF;
    Ist das möglich in Sql abzubilden?

    lg

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.254
    Die Frage verstehe ich jetzt nicht.
    "bis in diesem Feld Null steht" entspricht doch "where Feld = 0".

    "Not %Found" ist in SQL " where not exists (select * from blabla where ....)"
    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
    Mit dem Wert aus dem Feld B1NR02 chaine ich auf die BESTELLP und da steht entweder die Null drin oder ich muss mit der Nummer weitermachen.
    Wie weit ich zurückgehen muss ist verschieden.

  4. #4
    Registriert seit
    Feb 2001
    Beiträge
    20.254
    Die Aufgabe ist schwer zu begreifen: "oder ich muss mit der Nummer weitermachen"?
    Welche Nummer ist da gemeint?
    Im Moment würde ich "select max(B1NR02) into : MyMax from BESTELLP" annehmen.
    Wenn SQLCOD = 0 => erfolgreich, sonst sollte SQLCODE = 100 => keine Daten sein.
    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

  5. #5
    Registriert seit
    Apr 2012
    Beiträge
    360
    Sorry, aber mit der Formulierung habe ich mir schwer getan.
    J
    a ich muss mit der Nummer die ich ermittelt haben wieder weitermachen.
    Schuss ist sobald die B1NR02 0 ist.
    Der Primary-Key der Datei ist B1NR01
    Code:
    B1NR01 B1NR02
    25000  24800
    24800  24795
    24795  0

  6. #6
    Registriert seit
    Apr 2012
    Beiträge
    360
    Danke vielmals,

    Connect By Prior scheint die Lösung zu sein.
    Werde mal sehen wie performant das ist.
    lg

  7. #7
    Registriert seit
    Feb 2001
    Beiträge
    20.254
    Da benötigst du doch wieder einen Cursor und musst alle Sätze bis zum letzten lesen.
    Oder du packst das dann in eine derived table:
    select * from (
    select .... connect by ....
    ) hugo
    where B1NR02 = 0
    da du ja nur den letzten benötigst.
    Gelesen werden muss aber trotzdem alles und ist eben ein eher schlechtes Datenmodell.
    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
    Aug 2001
    Beiträge
    2.877
    Zitat Zitat von Fuerchau Beitrag anzeigen
    Da benötigst du doch wieder einen Cursor und musst alle Sätze bis zum letzten lesen.
    Braucht er nicht!
    Wenn er die Lösung so nimmt wie angegeben, benötigt er lediglich einen SELECT ... INTO, da in dem Beispiel der letzte Satz ausgegeben wird.
    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

  9. #9
    Registriert seit
    Feb 2001
    Beiträge
    20.254
    Welches Beispiel?
    Soweit ich das sehe liefert der Connect doch alle Sätze der Verbindung.
    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
    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.

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

  12. #12
    Registriert seit
    Nov 2003
    Beiträge
    2.309
    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=

Berechtigungen

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