-
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
-
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.
-
... 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
-
Ketzerische Frage:
Läuft der Select im ACS denn durch?
kf
-
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
-
By TheDevil in forum IBM i Hauptforum
Antworten: 16
Letzter Beitrag: 07-11-19, 11:52
-
By pk50226 in forum IBM i Hauptforum
Antworten: 6
Letzter Beitrag: 23-08-17, 11:12
-
By woodstock99 in forum NEWSboard Programmierung
Antworten: 1
Letzter Beitrag: 22-03-16, 07:40
-
By Twinkie in forum NEWSboard Programmierung
Antworten: 3
Letzter Beitrag: 14-12-15, 11:23
-
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
-
Foren-Regeln
|
Erweiterte Foren Suche
Google Foren Suche
Forum & Artikel Update eMail
AS/400 / IBM i
Server Expert Gruppen
Unternehmens IT
|
Kategorien online Artikel
- Big Data, Analytics, BI, MIS
- Cloud, Social Media, Devices
- DMS, Archivierung, Druck
- ERP + Add-ons, Business Software
- Hochverfügbarkeit
- Human Resources, Personal
- IBM Announcements
- IT-Karikaturen
- Leitartikel
- Load`n`go
- Messen, Veranstaltungen
- NEWSolutions Dossiers
- Programmierung
- Security
- Software Development + Change Mgmt.
- Solutions & Provider
- Speicher – Storage
- Strategische Berichte
- Systemmanagement
- Tools, Hot-Tips
Auf dem Laufenden bleiben
|
Bookmarks