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

    select into wie fetch next

    Hi *all

    habe eine Datei mit zig Mio Datensätzen.
    Muß mit ganz best. Werten lesen.
    Wenn ich einen passen den Satz habe folgen diverse Aktionen die ggf aussagen:
    Diese Gruppe nicht!

    suche nun nach einer Möglichkeit wie dieser: (RPG und SQL gemixt)

    PHP-Code:
    eval Start 0

    do ...
    select f1f2f3 ... into :f1, :f2, :f3 where feld = :wert ....
    and 
    F1 > :start

    Wenn diese Gruppe sich als ungünstig herausstellt
    :
    if 
    nichtgut
      
    eval start f1 1
    endif
    enddo 
    Nun geht das natürlich nicht weil der select ja mehr als einen Satz bringt.

    Wenn ich Fetche muß ich für den neuen Startpunkt auch neu preparen
    select first oder select next kenn ich aber nur im fetch.

    Mach ich nen Denkfehler?

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

  2. #2
    Registriert seit
    Jan 2012
    Beiträge
    1.120
    Kannst du nicht einfach fetch first row only verwenden?
    Code:
    select f1, f2, f3 ... into :f1, :f2, :f3 where feld = :wert ....
    and F1 > :start 
    fetch first row only
    Dieter

  3. #3
    Registriert seit
    Mar 2002
    Beiträge
    5.287
    ... letzteres funzt ohne order by allenfalls zufällig.
    Warum nicht gleich einen Cursor mit order by und where und dann lesen bis es schmeckt. Sollte man das in Sprüngen haben wollen bleibt wieder der cursor mit Hostvariable und open lesen close, Hostvar hochzählen und von vorne mit open, fetch und close. Oder der Selct into mit order by, versteht sich und Hostvar in der where Klausel mit fetch first row only...

    D*B
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  4. #4
    Registriert seit
    Feb 2001
    Beiträge
    20.236
    Wie mein Vorredner schon sagt: fetch first 1 rows only
    Wenn ein SQL mehr als 1 Zeile bringt, wird der INTO nicht ausgeführt sondern ein negativer SQLCODE gesetzt.
    Nur wenn man eine Struktur mit Mehrfachvorkommen (DIM, OCCURS) hat, kann ein INTO mehr als 1 Zeile haben allerdings nicht mehr als Dimensionen, sonst gibt's wieder einen Fehler.
    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
    Jun 2001
    Beiträge
    1.975
    Moin zusammen,

    fetch first 1 rows only
    versuch ich

    ... letzteres funzt ohne order by allenfalls zufällig.
    die PF ist mit Index, also als PF schon sortiert.
    Das passt auch. füge aber den order by noch hinzu


    Warum nicht gleich einen Cursor mit order by und where und dann lesen bis es schmeckt. Sollte man das in Sprüngen haben wollen bleibt wieder der cursor mit Hostvariable und open lesen close, Hostvar hochzählen und von vorne mit open, fetch und close.
    Na klar wäre das die Alternativen
    @lesen bis es schmeckt
    könnte im ungünstigen fall bedeuten das ich 30-40.000 Sätze überlesen muß

    @open, fetch close
    So hatte ich sogar angefangen. Aber mein Gefühl hat dann behaubtet: "das ist langsam"

    @Baldur
    Das hab ich (nachdem ich fertig war) auch festgestellt, daher die Frage.
    Eine Tabellenlösung geht nicht, Unbekannt viele Sätze, von denen nur der 1. gebraucht wird.


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

  6. #6
    Registriert seit
    Jan 2012
    Beiträge
    1.120
    Zitat Zitat von Robi Beitrag anzeigen
    die PF ist mit Index, also als PF schon sortiert.
    Das passt auch. füge aber den order by noch hinzu
    Wenn die Sortierung für dich wichtig ist, musst du bei SQL auf JEDEN FALL ein order by angeben. Nur weil die physische Tabelle sortiert ist, muss SQL das nicht in der entsprechenden Reihenfolge verarbeiten!

    Dieter

  7. #7
    Registriert seit
    Mar 2002
    Beiträge
    5.287
    Zitat Zitat von Robi Beitrag anzeigen
    Na klar wäre das die Alternativen
    @lesen bis es schmeckt
    könnte im ungünstigen fall bedeuten das ich 30-40.000 Sätze überlesen muß
    ... wenn es denn so sei, dass es egal ist welchen von den 30-40.000 Sätzen man haben will, könnte auch ein select distinct, oder ein Group by das überlesen beseitigen können...

    D*B
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  8. #8
    Registriert seit
    Nov 2003
    Beiträge
    2.306
    Würde es vielleicht auch mit SETLL und READE gehen?

  9. #9
    Registriert seit
    Feb 2001
    Beiträge
    20.236
    Native geht so was meist auch, die Anforderung ist doch aber dies mit SQL zu lösen.
    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
    Jun 2001
    Beiträge
    1.975
    @Dieter
    leider in dieser Konstellation nicht "ohne Klimmzüge" machbar.

    @Pikach
    native wollt ich nicht, da ich so viele Where Bedingungen habe
    Das Notwendige steht über dem technisch machbaren.
    (klingt komisch, funktioniert aber!)

  11. #11
    Registriert seit
    Aug 2001
    Beiträge
    2.873
    Vielleicht verstehe ich die Anforderung ja nicht richtig aber ...
    Du willst die kleinste F1 ermitteln, die die Bedingungen in der WHERE-Bedinung erfüllt und aus dieser F1 den ersten Satz, der evtl. noch andere Bedingungen erfüllt oder, den man durch Sortierung an die erste Stelle setzen kann?
    Wenn das so ist, muss Du zunächst die kleinste F1 ermitteln, diese dann wieder mit der Tabelle verknüpfen und den gewünschten Satz selektieren, etwa so:

    Code:
    Exec SQL
    With Minimum as (Select Min(F1) MinF1
                       From YourTable
                       Where .....)
    Select F1, F2, ... FN
      Into :Host1, :Host2, ... HostN 
    From YourTable join Minimum on F1 = MinF1
    where ...
    Order By ...
    Fetch First Row only;
    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. Brauche Hilfe zu FETCH xxx USING DESCRIPTOR
    By AndreasH in forum IBM i Hauptforum
    Antworten: 13
    Letzter Beitrag: 08-05-15, 13:09
  2. fetch for 1000 Rws only
    By Robi in forum NEWSboard Programmierung
    Antworten: 3
    Letzter Beitrag: 09-03-15, 15:56
  3. Antworten: 7
    Letzter Beitrag: 24-04-14, 10:00
  4. SQL Select
    By TARASIK in forum IBM i Hauptforum
    Antworten: 2
    Letzter Beitrag: 19-09-02, 10:59
  5. SQL SELECT mit Endsumme ?
    By Schnichels in forum IBM i Hauptforum
    Antworten: 1
    Letzter Beitrag: 11-01-02, 13:45

Berechtigungen

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