[NEWSboard IBMi Forum]
Seite 2 von 2 Erste 1 2
  1. #13
    Registriert seit
    Aug 2001
    Beiträge
    2.873
    Warum willst Du denn überhaupt einen SELECT ... FETCH FIRST ROW?
    Warum verdichtest Du die Daten nicht entsprechend mit einem Key in einer CTE (oder auch in einem SELECT in der FROM-Anweisung) und joinst das Ergebnis?
    Mit dieser Technik, kann man in der Beispiel-View auch mindestens einen SELECT sparen. Bei dem Benutzer bin ich mir nicht ganz sicher, ob der auch in der gleichen CTE abgehandelt werden kann, dazu müsste ich die Dateien und Daten kennen.
    ... so auf die Schnelle, könnte das SELECT-Statement in der View wie folgt umgeschrieben werden (und zwar OHNE LATERAL).

    Code:
    With x as (select Firma, AuftragNr, KundenNr, ArtikelKZ, ArtikelNr, AuftragsPosition, 
                      count(*)          AnzInfoText,
                      Max(DateInfoText) AnzLastTextDate,
                  from ordtxt01V),
                  
         y  as (Select Firma, AuftragNr, KundenNr, ArtikelKZ, ArtikelNr, AuftragsPosition,
                       Benutzer as AnzInfoUser
                       Row_Number() Over(Partition By Firma, AuftragNr, KundenNr, 
                                                      ArtikelKZ, ArtikelNr, AuftragsPosition
                                         Order By DateInfoText Desc) LfdNr
                                         
    select hdr.nlg                 as Firma  ,
            hdr.auftragsnr          as auftragsnr,
            hdr.kundennr            as kundennr,
            part.KDNAM1             as Kundenname,
            hdr.bestellnr           as bestellnr,
            hdr.datum_auftrag       as datum_auftrag,
            hdr.allamount           as allamount,
            pos.AUFTAGSPOS          as auftragsposition ,
            pos.artikelkz           as artikelkz,
            pos.artikelnr           as artikelnr,
            pos.bezeichnung1        as bezeichnung1,
            pos.bestellmenge        as bestellmenge,
            pos.waehrung            as waehrung,
            case when pos.waehrung = 'EUR' then  bruttopreiseur
                 when pos.waehrung <> 'EUR' then bruttopreis    end as Bruttopreis,
            case when pos.waehrung = 'EUR' then  poswerteur
                 when pos.waehrung <> 'EUR' then poswert          end as poswert,
          AnzInfoText,
          AnzInfoUser,
          AnzLastTextDate
     from wbordoh02v hdr join wbordop01v pos on hdr.AUFTRAGSNR =  pos.AUFTRAGSNR
                         join x              on     hdr.nlg        =  x.FIRMA
                                                and hdr.auftragsnr =  x.AUFTRAGNR
                                                and hdr.kundennr   =  x.KUNDENNR
                                                and pos.artikelkz  =  x.ARTIKELKZ
                                                and pos.artikelnr  =  x.ARTIKELNUMMER
                                                and pos.AUFTAGSPOS =  x.AUFTRAGPOSITION  
                         join y              on     hdr.nlg        =  y.FIRMA
                                                and hdr.auftragsnr =  y.AUFTRAGNR
                                                and hdr.kundennr   =  y.KUNDENNR
                                                and pos.artikelkz  =  y.ARTIKELKZ
                                                and pos.artikelnr  =  y.ARTIKELNUMMER
                                                and pos.AUFTAGSPOS =  y.AUFTRAGPOSITION                                                         
                                                and y.LfdNr        = 1;
    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

  2. #14
    Registriert seit
    Feb 2001
    Beiträge
    20.236
    Es geht aber z.B. darum, die letzte Information eines Joins zu bekommen, dessen Key ich so nicht kenne:

    select * from table1 a
    left join (select wert from table2 b where a.key=b.key order by b.key, b.datum desc fetch first 1 rows only)
    Dies funktioniert so nur nicht.

    Ein häufiger Vorgang, den ich früher per

    select a.*, c.value from table1 a
    left join (Select key, max(Datum) Datum from table2 group by key) on a.key = b.key
    left join table2 c on b.key=c.key and b.datum = c.datum

    Der allerdings relativ langsam ist.
    Seit der Möglichkeit dies per lateral zu verwenden, kann ich nun das selbe einfach erreichen:

    select * from table1 a
    cross join lateral
    (select value from table2 b where a.key=b.key
    order by key, datum desc
    fetch first 1 rows only) x

    Und dies ist um Faktoren schneller. Zumal ich so auch skalare subselects, die u.U. auf dieselbe Tabelle verweisen, zu einem join lateral zusammen fassen kann.
    Wenn du dir die obige View ansiehst, so werden 3 skalare subselects auf eine Tabelle durchgeführt.
    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. #15
    Registriert seit
    Mar 2002
    Beiträge
    5.287
    ... m.E. zunehmend off topic.
    Warum geht denn ein create view schief???
    1.) das SQL Statement ist fehlerhaft
    2.) eine der beteiligten Dateien ist beschädigt
    3.) die Metadaten der DB sind beschädigt
    4.) die Query Engine kriegt den create view trotzdem nicht hin

    @1: scheidet bei Neuerstellung einer bestehenden View aus (oder das Problem sitzt vor dem Bildschirm).
    @2: wird oft auch vom Save angemotzt und RCLSTG sollte das heilen..
    @3: RCLSTG oder RCLSTG *DBXREF sollte das heilen.
    @4: eine wahrscheinliche Variante, auch die Fehlermeldung deutet drauf hin.
    Hierbei ist zu überlegen, was beim create view eigentlich passiert:
    - Erstellung Feldliste (eine View kann dspffd) mit Typen etc.
    - Erstellung übriger Header des LF (eine View kann dspfd)
    - Syntaxprüfung des Statements
    Unterstellt, dass das Statement legal ist, dann sind eher die neueren Features und jede Form von Mehrstufigkeit die Kandidaten und nicht die base features.
    Also würde ich versuchen CTEs durch die inline Varianten zu ersetzen und soweit möglich in eigene create views auszulagern. Konstrukte, die durch aufteilen im mehrere Views vereinfacht werden können zu teilen, fördert ohnehin Lesbarkeit und Wartbarkeit.
    Software defect würde ich in jedem Fall reklamieren, da die Query Engine Views, die legal sind, auch zu erstellen hat.

    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. #16
    Registriert seit
    Jan 2007
    Beiträge
    905
    Ketzerische Frage:
    Läuft der Select im ACS denn durch?
    kf

  5. #17
    Registriert seit
    Jan 2001
    Beiträge
    833

    Thumbs up

    Hallo zusammen,

    es hat zwar ein bisschen gedauert, aber die IBM hat ein Testptf erstellt.

    Nach der Installation funktioniert das Erstellen des Views einwandfrei.

    Somit wird die Fehlerbehebung auch in die Cum Tapes mit einfliessen.

    Good Job :-)

Similar Threads

  1. NET USE Systemfehler 64 Windows 10 Bitdefender
    By TheDevil in forum IBM i Hauptforum
    Antworten: 16
    Letzter Beitrag: 07-11-19, 11:52
  2. System-Nachricht mit Variablen
    By pk50226 in forum IBM i Hauptforum
    Antworten: 6
    Letzter Beitrag: 23-08-17, 11:12
  3. Nachricht unterdrücken
    By woodstock99 in forum NEWSboard Programmierung
    Antworten: 1
    Letzter Beitrag: 22-03-16, 07:40
  4. CL- Programm- Nachricht beantworten
    By Twinkie in forum NEWSboard Programmierung
    Antworten: 3
    Letzter Beitrag: 14-12-15, 11:23
  5. Nachricht ins BRMS-Log senden?
    By Chris.jan in forum IBM i Hauptforum
    Antworten: 3
    Letzter Beitrag: 26-07-15, 05:13

Berechtigungen

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