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

Thema: Sql Rekursiv

Hybrid View

  1. #1
    Registriert seit
    Aug 2001
    Beiträge
    2.961
    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 - 6. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  2. #2
    Registriert seit
    Aug 2001
    Beiträge
    2.961
    Nochmal zum Verständnis:
    In Deiner Bestell-Datei sind für B1BNR01 mehrere gleiche Werte. In B1BNR02 sind für den gleichen B1BNR01-Schlüssel-Wert mehrere verschiedene Werte und u.a. ist auch mindestens 1x der Wert 0 zu finden (kein NULL-Wert?!).
    Du versuchst für einen bestimmten Schlüssel den Satz mit der 0 zu finden?

    Sofern es das ist, das Du das willst, kann es mit SQL ganz einfach gelöst werden (da braucht man auch kein verschachteltes Sub-Select)

    Code:
    Select Fld1, Fld2, ... FldN
    From YourTable
    Where B1BNR01 = 'YOURVALUE' and B1BNR02 = 0;
    Mir ist übrigens auch schleierhaft, warum Du deinen Key nicht einfach um ein zweites Schlüssel-Feld erweiters (bzw. eine LF oder besser einen SQL Index anlegst mit 2 Schlüssel-Feldern. Dann könntest Du den Satz auch mit native I/O direkt greifen.

    Solltest Du stattdessen tatsächlich eine Rekursion wollen, d.h. mit dem in B1BNR02 gefundenen Wert muss ein Zugriff auf B1BNR02 erfolgen und der letzte Wert in B1BNR02 ermittelt werden, könnte die Abfrage evtl. wie folgt aussehen (Mindest-Release 7.1)

    Code:
    Select *
      From YOURTABLE
      Start With B1BNR01 = 'YOURVALUE'
      Connect By Prior B1BNR01 = B1BNR02
      Order By Level Desc
      Fetch First Row Only;
    Birgitta
    Birgitta Hauser

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

  3. #3
    Registriert seit
    Feb 2001
    Beiträge
    20.869
    So wie es aussieht könnte es sich um eine "verkettete Liste" handeln.
    D.h., das Feld B1NR02 verweist "rekursiv" auf sich selbst, bis der letzte Satz keinen weiteren Verweis mehr hat, z.B.:
    1 => 5 => 12 => 0
    2 => 3 => 7 => 11 => 0
    17 => 4 => 6 => 35 => 0
    Dies ist mit einer SQL-Methode hier tatsächlich nicht zu lösen sondern ebenso mittels einzelner "Select into " zu lösen. Ein Cursor ist nicht erforderlich.

    Allerdings solltest du dir hier tatsächlich ein anderes Model entwickeln, denn solche Strukturen sind SQL-technisch nicht vernünftig und schon gar nicht performant auswertbar.
    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

Berechtigungen

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