locked
SQL-Techniken gesucht RRS feed

  • Frage

  • Hallo zusammen,

    hat jemand vielleicht einen Literaturtipp oder Link bzgl.
    SQL-Abfragetechniken ?

    Seit Version 9 hat der Fuchs ja seine Qualitäten in Sachen SQL-Abfragen
    stark vebessert. Also z.B. mehrere select in where -Klauseln sind möglich usw.
    (oder ist das nur hohles Gerede ? )

    Pfriemel hier gerade eine Abfrage aus 5 Usereingaben zusammen von
    denen aber nur die abgefragt werden sollen die eingegeben wurden
    und diese dann aber exakt. Und ich denk in Zukunft werd ich mehr
    Verschachteltes bekommen und will das natürlich sicher und
    möglichst performant lösen. Ich suche KEINE Infos über die Syntax
    von SQL sondern über musterhafte Lösungsansätze von diversen
    komplizierteren Aufgabenstellungen (falls es sowas gibt).

    TIA und Grüsse aus dem leicht verschneitem WBL
    Horst

    Mittwoch, 16. Januar 2013 09:00

Alle Antworten

  • Wenn Du im Vorhinein nicht weißt, wie viele Kriterien kommen können (eventuell auch 0, oder 10 oder was weiß ich) dann ist wahrscheinlich die Makro-Substitution am Schnellsten. Also sowas wie:

    lcWhere = "WHERE .T."

    IF llBedingung1 THEN

    lcWhere = lcWhere + " AND feld1 = wert1"

    ENDIF

    IF llBedingung2 THEN

    lcWhere = lcWhere + " AND feld2 = wert2"

    ENDIF

    SELECT * FROM tabelle &lcWhere.

    Klar, bedingte Kriterien wären auch möglich, aber ich wage zu bezweifeln, dass das performant ist:

    SELECT * FROM tabelle ;

    WHERE IIF(llBedingung1, feld1 = wert1, .T.) ;

    AND IIF(llBedingung2, feld2 = wert2, .T.)

    Mittwoch, 16. Januar 2013 10:20
  • Hach

    da gibts ja tatsächlich noch den einen oder anderen alten Fuchs ...

    Ja, so habe ich das hier auch gemacht. Aber ich habe mir gedacht das
    es vielleicht auch SQL-native performante Varianten geben kann
    und da ich zukünftig wahrscheinlich mehr von dieser Sorte kriege mal diese
    Frage gestellt.
    Bei der Fox-Hilfe weiß ich in diesem Punkt nicht immer so genau wie erschöpfend die
    Infos so sind. Klar bekommt man alles zusammengegoogelt aber wenn einer
    schon DEN Nachlesetipp hat ist es halt schneller.

    Dank Dir für Deine Bestätigung meiner Verfahrensweise, tut ja auch gut
    zu wissen das man manchmal was richtig macht :-))

    Grüsse vom Süntel

    Horst

    Mittwoch, 16. Januar 2013 10:52
  • Die dynamische Zusammensetzung von WHERE-Klauseln ist schon die richtige Lösung. Das geht ja auch mit anderen (Remote) Datenbanken genauso, obwohl die keine Makrosubstitution verstehen, aber man sendet ja ein SQL sowieso als String.

    Es gibt dazu einerseits natürlich noch Stored Procedures, die eben compiliert sind und bei denen dann dynamisches SQL auch gerade deswegen verpöhnt ist, aber selbst innerhalb VFP bedeutet das jeweils einmalig compilieren für die Gesamt Abfrage und die Abfragedauer übersteigt die Compilerzeit bei weitem. Es ist ja nicht so, daß pro Datensatz compiliert wird.

    In meinen Anfangszeiten habe ich gerne mal selbst die SQL-Engine gespielt und selbst indizes gesetzt, relations gesetz, mit SEEK und SCAN REST oder SET KEY gearbeitet, und in vielen Situationen ist man damit sehr performant aber die relativ bessere Lesbarkeit und übertragbarkeit auf andere Datenabnken macht SQL schon zur Wahl.

    Die Diskussion wolltest Du jetzt zwar gar nicht anstoßen, aber das hängt insofern damit zusammen, daß man SQL schon als erste Wahl an und für sich nehmen kann. Und Makrosubstitution ist hier nicht unbedingt ein Frevel, der die Übertragbarkeit von Abfragen reduziert.

    Setzt man Abfragen Clientseitig dynamisch zusammen, und das kann man auch ohne Makrosubstitutionsoperator ja als String-Verkettung in jeder Client-Sprache und schickt eine solche Abfrage an einen SQL Server, dann nennt sich das AdHoc-Abfrage und ist völlig erlaubt. Genauso fänt auch folgender Artikel an:

    http://use-the-index-luke.com/de/sql/where/verstuemmelung/bedingte-klauseln

    Das ist in dem Fall Ausschnitt aus einem Buch, was ich damit nicht empfehlen will, aber der Abschnitt ist schon ganz brauchbar.

    Ich denke Du wirst eher viele gute Blogartikel in der Art finden, als solche Bücher. Wenn dann eher wie das hier auch eins ist, ein Buch über Performanceoptimierungen einer speeziellen Datenbank. Gute Abfragen zu schreiben ist ja nur eine Seite dieser Münze.

    Tschüß, Olaf.

    Mittwoch, 16. Januar 2013 13:57
  • Moin, moin

    auch wir verwenden i.d.R. zusammengekettete Abfragen, wie Olaf und Matthias schon schrieben : Am ende ists ein String. Bei Literalen oder direkter Verwendung kein Problem

    Wenn man allerdings die Datenabfrage mit SQLexec() in eine eigene Funktion ausgelagert hat, z.B. um dort die Rückgabewerte zentral abzuhandeln, muss man sich über den Gültigkeitsbereich der in der Abfrage verwendeten Variablen Gedanken machen. Ich nutze dann TEXT TO mit Textmerge und <<>> oder ein Applikationsweites Filterobjekt mit Propertys für Datum/pk/Char/Num,.....

    Manchmal ärgert einen der Fox (oder irgendwelche Einstellungen) trotzdem noch. nWert =2 wird in einer ODBC SQLEXEC zu where ... = 2,00 und findet dann evt. keinen Treffer, Abhilfe ist INT().

    Grüße aus dem Schneechaos (HH, 5 cm)

    Tom

    Mittwoch, 23. Januar 2013 10:38