Anmelden

View Full Version : SQL view



lieser
05-11-04, 09:30
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

Fuerchau
05-11-04, 12:27
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.

BenderD
05-11-04, 13:13
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



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.

Fuerchau
05-11-04, 13:35
@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.

BenderD
05-11-04, 14:34
@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


@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.

lieser
08-11-04, 04:11
Vielen Dank für Tipps !!!

Gruss
Wolfgang