Hallo,
Manche auf den ersten Blick trivial erscheinende Dinge sind doch nicht so einfach wie es scheint ...
<b>Problemstellung:</b><br>
Verwendet wird Delphi 5 Enterprise und Interbase 5.6, Windows-2000 Server
Eine Abfragemenge über mehrere Tabellen, abgerufen über TQuery soll mittels WHERE eingegrenzt werden, damit die erhaltene Datenmenge (über das Netz) klein bleibt und keine nichtbenötigten Daten übertragen werden. Die Eingrenzung bezieht sich sowohl auf einen Start- als auf einen Endbereich.
Die Haupttabelle ist nach den Kriterien A,B und C sortiert. Nun kommt das Problem: <b>Die Eingrenzung soll nach allen 3 Kriterien möglich sein.</b> Ein einfaches Where-Statement ist also somit nicht möglich. Ich habe verschiedenste Where's probiert, es passiert aber immer wieder, daß hiebei Datensätze "nicht" übertragen werden, da es bei Betrachtung der Wahrheitstabelle Lücken gibt.
Beispiel der Tabelle:
FeldA,FeldB,FeldC
1 a A
1 a B
1 a C
1 b A
1 b B
1 b C
1 b D
1 c A
1 c B
1 c C
2 a A
2 a B
2 a C
2 b A
2 b B
usw.
Der Startbereich sieht z.B. aus: FeldA >= 2, FeldB >= b, FeldC >= C
Der Endbereich: FeldA <= 3, FeldB <= c, FeldC <= B
Ein WHERE-Statement zur Abfrage der Startbedingung wie<br>
WHERE ((FeldA >= DataA) and (FeldB >= DataB) and (FeldC >= DataC))<br>
produziert die eingangs erwähnten Lücken (passende Datensätze werden nicht erfasst). DataA ist hier 2, DataB ist b usw.
Eine Verschachtelung ab dem mittleren Statement <br>
... ((FeldB >= DataB) and (FeldA >= DataA)) ...<br>
löst das Problem auch nicht. Auch der OR-Operator kann nicht angewandt werden, da sonst ungewollte Daten übertragen werden.
Die Abfrage der Endebedingung scheint überhaupt nicht lösbar zu sein, da hier nicht einfach auf die Umkehrung der Operatoren geschlossen werden kann.
In Pascal würde ich die Startabfrage wie folgt codieren:<br>
if FeldA >= DataA then<br>
if FeldB >= DataB then<br>
if FeldC >= DataC then OK<br>
Diese ist für den Startbereich wasserdicht und liefert immer die gewünschten Ergebnisse.
Doch wie drücke ich das in SQL aus ???<br>
Zudem soll noch berücksichtigt werden, daß wenn ein Eingabeparameter leer ist, nicht zur Eingrenzung herangezogen werden darf<br>
(( if DataA > '') and (FeldA >= DataA)) then
Für die Abfrage der Endbedingung habe ich nicht mal eine Pascal-Lösung, denn eine einfach Umkehrung der Operatoren produziert wiederum die ungewollten Datenlücken.
Wie ist daher das Thema <b>Eingrenzung einer Datenmenge mit mehreren Abfragekriterien betreffend Beginn- und Startbereich zu lösen ?</b>
Ich bitte um ein komplettes SQL-Statement, falls meine Fragestellung lösbar ist.
Erklärung: mit FeldA ist das Spaltenfeld der Tabelle gemeint, DataA stellt das Eingabefeld dar, in welchem der Anwender den Start- bzw. Endebereich eingibt usw.
Kann man dieses Thema eventuell mittels Stored Procedure lösen ?<br>
Wie wird hier die Stored Procedure abgefasst und vor allem wie kann man sie in einem Where-Statement aufrufen ?
Sind UDF's verwendbar (user defined functions) ?<br>
Wie werden diese abgefasst und in einem Where-Statement angesprochen ?
Kann man in einem Where-Statement eine Pascal-Variable (Parameter ?) abfragen ?
Kann man in einer Query-Abfrage eine Variable (Parameter o.a.) auf Grund von Bedingungen setzen ?
Ich hoffe, es gibt Profis welche mein Problem lösen können.
Vielen Dank im Voraus<br>Helmut
Manche auf den ersten Blick trivial erscheinende Dinge sind doch nicht so einfach wie es scheint ...
<b>Problemstellung:</b><br>
Verwendet wird Delphi 5 Enterprise und Interbase 5.6, Windows-2000 Server
Eine Abfragemenge über mehrere Tabellen, abgerufen über TQuery soll mittels WHERE eingegrenzt werden, damit die erhaltene Datenmenge (über das Netz) klein bleibt und keine nichtbenötigten Daten übertragen werden. Die Eingrenzung bezieht sich sowohl auf einen Start- als auf einen Endbereich.
Die Haupttabelle ist nach den Kriterien A,B und C sortiert. Nun kommt das Problem: <b>Die Eingrenzung soll nach allen 3 Kriterien möglich sein.</b> Ein einfaches Where-Statement ist also somit nicht möglich. Ich habe verschiedenste Where's probiert, es passiert aber immer wieder, daß hiebei Datensätze "nicht" übertragen werden, da es bei Betrachtung der Wahrheitstabelle Lücken gibt.
Beispiel der Tabelle:
FeldA,FeldB,FeldC
1 a A
1 a B
1 a C
1 b A
1 b B
1 b C
1 b D
1 c A
1 c B
1 c C
2 a A
2 a B
2 a C
2 b A
2 b B
usw.
Der Startbereich sieht z.B. aus: FeldA >= 2, FeldB >= b, FeldC >= C
Der Endbereich: FeldA <= 3, FeldB <= c, FeldC <= B
Ein WHERE-Statement zur Abfrage der Startbedingung wie<br>
WHERE ((FeldA >= DataA) and (FeldB >= DataB) and (FeldC >= DataC))<br>
produziert die eingangs erwähnten Lücken (passende Datensätze werden nicht erfasst). DataA ist hier 2, DataB ist b usw.
Eine Verschachtelung ab dem mittleren Statement <br>
... ((FeldB >= DataB) and (FeldA >= DataA)) ...<br>
löst das Problem auch nicht. Auch der OR-Operator kann nicht angewandt werden, da sonst ungewollte Daten übertragen werden.
Die Abfrage der Endebedingung scheint überhaupt nicht lösbar zu sein, da hier nicht einfach auf die Umkehrung der Operatoren geschlossen werden kann.
In Pascal würde ich die Startabfrage wie folgt codieren:<br>
if FeldA >= DataA then<br>
if FeldB >= DataB then<br>
if FeldC >= DataC then OK<br>
Diese ist für den Startbereich wasserdicht und liefert immer die gewünschten Ergebnisse.
Doch wie drücke ich das in SQL aus ???<br>
Zudem soll noch berücksichtigt werden, daß wenn ein Eingabeparameter leer ist, nicht zur Eingrenzung herangezogen werden darf<br>
(( if DataA > '') and (FeldA >= DataA)) then
Für die Abfrage der Endbedingung habe ich nicht mal eine Pascal-Lösung, denn eine einfach Umkehrung der Operatoren produziert wiederum die ungewollten Datenlücken.
Wie ist daher das Thema <b>Eingrenzung einer Datenmenge mit mehreren Abfragekriterien betreffend Beginn- und Startbereich zu lösen ?</b>
Ich bitte um ein komplettes SQL-Statement, falls meine Fragestellung lösbar ist.
Erklärung: mit FeldA ist das Spaltenfeld der Tabelle gemeint, DataA stellt das Eingabefeld dar, in welchem der Anwender den Start- bzw. Endebereich eingibt usw.
Kann man dieses Thema eventuell mittels Stored Procedure lösen ?<br>
Wie wird hier die Stored Procedure abgefasst und vor allem wie kann man sie in einem Where-Statement aufrufen ?
Sind UDF's verwendbar (user defined functions) ?<br>
Wie werden diese abgefasst und in einem Where-Statement angesprochen ?
Kann man in einem Where-Statement eine Pascal-Variable (Parameter ?) abfragen ?
Kann man in einer Query-Abfrage eine Variable (Parameter o.a.) auf Grund von Bedingungen setzen ?
Ich hoffe, es gibt Profis welche mein Problem lösen können.
Vielen Dank im Voraus<br>Helmut
Comment