SQL: wenn's vorkommt, dann nimm auch die vorher

23/04/2010 - 20:43 von Nicole Wagner | Report spam
Liebe User,


gegeben ist eine SQL Abfrage, die auf (ich hoffe) das Wesentliche
reduziert so aussieht:

select
FK_Datum, flag
from tbzeilen
where myfk = 15
order by tbzeilen.FK_Datum


Interessant ist die Spalte Flag.
Die Spalte Flag ist sehr oft NULL, doch manchmal steht ein x drin.

WENN das Flag x ist, dann ist es eine chronologische Gruppe und es gibt
keine zweite Gruppe zu demselben myfk.

Plakatives Beispiel fuer so eine Gruppe/Periode: die Adventzeit 2003
Die Adventzeit hat einen Anfang und ein Ende und es gibt im Jahr 2003
keinen zweiten Advent.


Ich will jetzt Folgendes tun:

1)
Ich will alle zeilen betrachten, die einen myfk von (z.B.) 15 haben.
Soweit, so einfach

2)
HAT KEINE dieser Zeilen ein Flag, so sollen ALLE zeilen ignoriert
werden.

3)
Hat MINDESTENS EINE der Zeilen, die myFK aufweisen, ein Flag, dann
sollen nicht nur diese Zeilen in meiner Query zurueckgegeben werden,
sondern auch eine bestimmte Anzahl davor.

Hier faellt mir in SQL leider nichts mehr ein.

Gefühlsmaessig (ist immer schlecht in der EDV) koennte ich mir
vorstellen, dass es mehr oder weniger effiziente Wege ins Ziel gibt.


Ein Beispiel:

myfk = 11 Flag=NULL

myfk = 15 Flag=NULL
myfk = 15 Flag=NULL
myfk = 15 Flag=NULL
myfk = 15 Flag=NULL
myfk = 15 Flag=NULL
myfk = 15 Flag=x
myfk = 15 Flag=x
myfk = 15 Flag=NULL

alle Zeilen mit myfk, in denen das Flag nicht da ist, werden ignoriert.
Also faellt alles zu myfk weg.

Ist das Flag da, so wollen wir auch die Tage vorher. Sagen wir 2.
D.h. die Query soll liefern:

myfk = 15 Flag=NULL
myfk = 15 Flag=NULL
myfk = 15 Flag=x
myfk = 15 Flag=x

im besten Fall auch noch mit der Option, die 2 Tage DANACH auch
mitzunehmen.


Danke fuer Tipps!

Nicole
 

Lesen sie die antworten

#1 Thomas G. Liesner
23/04/2010 - 21:25 | Warnen spam
Nicole Wagner schrieb:
gegeben ist eine SQL Abfrage, die auf (ich hoffe) das Wesentliche
reduziert so aussieht:



Den Gruppenausschluss dürftest du mit einer Sub-Query hinkriegen
(unabhàngig jetzt von der erzielten Performance), aber du machst
weiterhin einen grundsàtzlichen Denkfehler im Zusammenhang mit SQL:

Ist das Flag da, so wollen wir auch die Tage vorher.


^^^^^^

SQL arbeitet mit MENGEN und kennt KEINE echte REIHENFOLGE, "order by"
bezieht sich nur auf das Ergebnis, ist aber keine Teil der Filterung!

Somit bleibt nur die klassische While not eof-Schleife im Delphi-Code,
dem du ein Gedàchnis für zwei oder mehr Datensàtze zur Seite stellst, um
deine Wunschfilterung zu realisieren.

Die noch sinnvollere Variante wàre natürlich ein Datenbankdesign, wel-
ches die Inhalte so abbildet, dass passende SQL-Abfragen ohne jeden
Klimmzug möglich werden.

So long,
Thomas G. Liesner

Ähnliche fragen