Mehrere Filter auf Datenbank anwenden und kombinieren



  • Hallo Forum

    ich habe eine Datenbank in SQL Server 2005 aufgesetzt mit mehreren Tabellen. Nun habe ich einen Zugriff auf die Datenbank mit Hilfe einer Webseite in ASP.Net implementiert. Der Benutzer hat hier die Möglichkeit, mehrere Filter anzuwenden. Die einzelnen Filterfunktionen habe ich implementiert und sie funktionieren. Wie aber kann ich jetzt mehrere Filter sinnvoll miteinander verknüpfen? Die Filter sollen mit logischen Unds verknüpft sein, das bedeutet wenn bereits ein Filter ausgewählt wurde und jetzt der nächste gesetzt wird, so soll dieser Filter auf die gefilterten Daten des vorherigen Filters zugreifen. Insgesamt habe ich 5 Filter, die ich miteinander kombinieren möchte. Gibt es da eine "schöne" Lösung, also sowas dass ich meine eine Filterabfrage in einer Zwischentabelle habe auf die dann der nächste Filter zugreifen kann u.s.w.? Oder muss ich das so machen:

    SqlCommand command = new SqlCommand("SELECT Tabelle1.Spalte1 from Tabelle1 WHERE Tabelle1.Spalte1 = @Filter1.Value AND Tabelle1.Spalte1 = @Filter2.Value AND....");
    

    Allerdings setzte ich dann ja alle Filter gleichzeitig ein. Schöner wäre es (und vielleicht auch schneller?) wenn ich auf bereits gefilterten Daten arbeiten könnte. Hat mir da jemand einen Tipp?



  • Hallo,

    deine Abfrage sieht etwas unsinnig aus...
    Da kommt ja nie was raus, wenn du unterschiedliche Filter auf die selbe Spalte mit 'AND' verknüpfst.
    Meinst du nicht eher OR oder unterschiedliche Spalten?

    Aber zu deiner Frage:
    Mal abgesehen von der Unsinnigkeit ist das die schnellste Lösung.
    Die Tabelle muss doch nur einmal durchlaufen werden. Da irgendwelche Zwischentabellen zu erstellen ist dich quatsch, zumindest auf Datenbank-Ebene.

    In deiner Web-Applikation könntest du allerdings die Abfrage eines Filters cachen und wenn dann eine Abfrage mit einem weiteren Filter kommt, dann nur aus den
    Cache-Daten filtern.



  • Klar, sorry, der WHERE-clause sollte natürlich schon auf unterschiedliche Spalten bezogen sein. Pro Filter kommt eine andere Spalte zusätzlich hinzu.

    Wie mache ich das Cachen auf Webapplication-Ebene am sinnvollsten? Eignet sich dazu eine DataTable oder eine DataView besser? Ansonsten führe ich halt meine SELECT-Abfrage pro aktuell ausgeführtem Filter aus + den anderen ausgewählten. Also im Endeffekt immer dann wenn ein Filter aktiviert wird. Irgendwie macht es da dann doch wahrscheinlich mehr Sinn die Daten aus der Datenbank einmal abzurufen und dann mit den gecachten Daten weiterzuarbeiten?



  • Wenn der nachvollgende Filter sich immer auf den davor bezieht dann bleibt dir nichts anderes übrig als entwerder mit Temptables zu arbeiten (auf dem RDBMS) oder eben den ersten Filter in ein Datatable und die anderen immer wieder auf dieses Datatable anzuwenden.
    mit SQL ist das zwar auch möglich aber nur sehr kompliziert mit SUBSELECTS u.s.w.

    http://www.insidesql.org/beitraege/entwicklung/dynamische-suchbedingungen-in-t-sql


Anmelden zum Antworten