-
SQL view
Hallo Forum,insbesondere die SQL Freaks
ist folgendes realisierbar:
ich habe eine Preisdatei mit folgenden Feldern:
artnr-teil1, artnr-teil2, ..... preis,tag,monat,jahr,....
pro art-nr können beliebig viele Einträge mit jeweils unterschiedlichem Gültigkeitsdatum (auch zukünftigem) existieren.
ich möchte eine SQL-View, die mir pro Artikel genau den einen
Eintrag mit dem größten Datum <= heute anzeigt.
(Artikel-Nr besteht aus 2 CHAR-Feldern, Gültigkeitsdatum
besteht aus 3 x 2S 0 Feldern)
Vielen Dank schon mal
Gruss
Wolfgang
-
select ....
from myfile a
where a.artnr concat digits(a.jahr) concat digits(a.monat) concat digits(a.tag) =
(select max(b.artnr concat digits(b.jahr) concat digits(b.monat) concat digits(b.tag))
from myfile b
where a.artnr = b.artnr
and date('20' concat digits(b.jahr) concat '-' concat digits(b.monat) concat '-' concat digits(b.tag)) <= current date)
Einfache wäre es, wenn das Datum (insbesonders das Jahr) bereits 8-stellig oder als Typ Date vorläge.
Als View ist das aber nicht unbedingt geeignet, da kein Order by möglich ist und der Zugriff dann ggf. etwas dauert.
Einfacher wäre der SQL direkt im Programm mit Parametern z.B. auf Artikel-Nr.
-
Hallo,
alternativ geht auch als join (den select max(...) mit der Table selber joinen) könnte schneller sein als die rekursive Lösung, die Baldur vorschlägt.
Ich würde schon zu der View raten, da dann das komplexe des Statements im Programm weg ist. Wenn man einen ORDER braucht, dann gibt man den bei dem Zugriff an.
Wie lange das ganze beim Zugriff selber dauert, das hängt davon ab, ob die entsprechenden Zugriffspfade da sind und da sieht es mit dem MAX über ein gebasteltes Feld schlecht aus, egal ob View, oder im SELECT beim Zugriff.
mfg
Dieter Bender
Zitat von Fuerchau
select ....
from myfile a
where a.artnr concat digits(a.jahr) concat digits(a.monat) concat digits(a.tag) =
(select max(b.artnr concat digits(b.jahr) concat digits(b.monat) concat digits(b.tag))
from myfile b
where a.artnr = b.artnr
and date('20' concat digits(b.jahr) concat '-' concat digits(b.monat) concat '-' concat digits(b.tag)) <= current date)
Einfache wäre es, wenn das Datum (insbesonders das Jahr) bereits 8-stellig oder als Typ Date vorläge.
Als View ist das aber nicht unbedingt geeignet, da kein Order by möglich ist und der Zugriff dann ggf. etwas dauert.
Einfacher wäre der SQL direkt im Programm mit Parametern z.B. auf Artikel-Nr.
-
@Dieter
Beim Join hast du das Problem, dass du nur mit 1:1 bzw. 1:n-Beziehungen arbeiten kannst, also nur Feld auf Feld bzw. Konstante auf Feld.
Du bekommst aber leider immer mehrere Sätze.
Die Forderung war nun mal, genau 1 Satz zu bekommen. Und hier steht SQL vor einem großen Problem (dass ich seit Einführung von Mandanten immer wieder habe).
Ich kann leider immer nur EIN Feld mit EINEM Ergebnisfeld eines Subselect verknüpfen.
Bei Mandanten habe ich aber immer noch 1 bis n zusätzliche Felder.
Um also diese Bedingung zu erreichen, muss ich mir mit CONCAT behelfen und da sind leider Zufgriffspfade ehe machtlos.
Bei der DB/400 habe ich einen leichten Vorteil, wenn ich DDS zu Hilfe nehme. Denn nur da kann ich mit berechneten Feldern (SUBST/CAT/DIGITS) auch einen Index erstellen !
Bei SQL geht das leider noch nicht (oder kenne ich das nur nicht ?).
Warum gehen auch die schönen SQL-Beispiele (übrigens auch anderer DB's) immer nur von EINEM Schlüsselfeld aus ?
Übrigens: SAP/R3 behilft sich da eben mit so unschönen Mitteln wie internen Strukturen auf Schlüsselfeldern.
-
@Baldur:
Irgendwas in folgender Art:
select b.*
from
(select artnr, max(concat(datum...)) as maxdat
from artikel....
group by artnr) as a, artikel as b
where a.artnr = b.artnr
and maxdat = concat(b.datum....)
Dieter Bender
Zitat von Fuerchau
@Dieter
Beim Join hast du das Problem, dass du nur mit 1:1 bzw. 1:n-Beziehungen arbeiten kannst, also nur Feld auf Feld bzw. Konstante auf Feld.
Du bekommst aber leider immer mehrere Sätze.
Die Forderung war nun mal, genau 1 Satz zu bekommen. Und hier steht SQL vor einem großen Problem (dass ich seit Einführung von Mandanten immer wieder habe).
Ich kann leider immer nur EIN Feld mit EINEM Ergebnisfeld eines Subselect verknüpfen.
Bei Mandanten habe ich aber immer noch 1 bis n zusätzliche Felder.
Um also diese Bedingung zu erreichen, muss ich mir mit CONCAT behelfen und da sind leider Zufgriffspfade ehe machtlos.
Bei der DB/400 habe ich einen leichten Vorteil, wenn ich DDS zu Hilfe nehme. Denn nur da kann ich mit berechneten Feldern (SUBST/CAT/DIGITS) auch einen Index erstellen !
Bei SQL geht das leider noch nicht (oder kenne ich das nur nicht ?).
Warum gehen auch die schönen SQL-Beispiele (übrigens auch anderer DB's) immer nur von EINEM Schlüsselfeld aus ?
Übrigens: SAP/R3 behilft sich da eben mit so unschönen Mitteln wie internen Strukturen auf Schlüsselfeldern.
-
Vielen Dank für Tipps !!!
Gruss
Wolfgang
Similar Threads
-
By christian_lettner in forum NEWSboard Programmierung
Antworten: 2
Letzter Beitrag: 16-11-06, 10:15
-
By FNeurieser in forum NEWSboard Programmierung
Antworten: 3
Letzter Beitrag: 11-10-06, 14:53
-
By loeweadolf in forum NEWSboard Programmierung
Antworten: 2
Letzter Beitrag: 01-06-06, 09:43
-
By Kaufmann in forum IBM i Hauptforum
Antworten: 17
Letzter Beitrag: 11-05-06, 14:57
-
By KM in forum NEWSboard Programmierung
Antworten: 4
Letzter Beitrag: 12-01-06, 08:52
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