Anzeige:
Ergebnis 1 bis 5 von 5

Thema: Viele Abfragen zusammenfassen möglich?

  1. #1
    Registrierter Benutzer
    Registriert seit
    17.12.2005
    Beiträge
    300

    Viele Abfragen zusammenfassen möglich?

    Hi allerseits,

    ich habe in meinem Programm viele kleine Datenbankabfragen und würde gerne wissen, ob ich die zu einer Abfrage zusammenfassen kann. Zugrunde liegt eine DBF-Datenbankdatei, die in Java über einen JDBC-Treiber angesprochen wird *grusel*

    Die Tabelle, um die es geht, hat die Spalten Datum (PrimaryKey,Date), Gruppennr (NUMBER), Partner (STRING), AufgabeErfüllt (BOOLEAN), WarAnwesend (BOOLEAN)

    Der Schlüssel ist die Datumsspalte. Für jeden Tag existiert ein Eintrag.

    Nun brauche ich mehrere Informationen aus der Tabelle, z.B. wie oft die Person in einem gewählten Zeitraum anwesend war (nach Jahren gruppiert). Für jede Zeile dieses Ergebnisses brauche ich jeweils noch die Gruppennr an einem bestimmten Datum, der Partner an einem anderen Datum und ob an einem dritten Datum die Aufgabe erfüllt wurde.

    Das ergibt die Abfragen
    Code:
    SELECT YEAR(Datum) Jahr, SUM(IF(WarAnwesend=true,1,0)) Anwesenheitstage
    FROM Tabelle WHERE Datum BETWEEN '2007-11-01' AND '2008-03-20'
    GROUP BY YEAR(Datum)
    Für die erste Zeile des Resultsets
    Code:
    SELECT Gruppennr FROM Tabelle WHERE Datum='2007-12-01'
    SELECT Partner FROM Tabelle WHERE Datum='2007-11-13'
    SELECT AufgabeErfüllt FROM Tabelle WHERE Datum='2007-12-20'
    Für die zweite Zeile des Resultsets sind dann nochmal diese Abfragen (mit anderen Daten) nötig.

    Da diese Abfragen sehr häufig notwendig sind, würde ich gerne möglichst wenig Datenbankzugriffe haben. Ist das möglich?

  2. #2
    Registrierter Benutzer
    Registriert seit
    07.05.2007
    Beiträge
    656
    Moin,

    Zitat Zitat von Hobbes Beitrag anzeigen
    *grusel*
    Ja, ich auch ;-) So auf den 1. Blick würde ich mal sagen: grottenhaft schlechtes DB-Design (wobei ich mich mit DBF nicht auskenne - ist das überhaupt ein relationales System? - ist das nicht dieses komische DBASE - Die Beständigste Aller Schlimmen Erfahrungen?).

    Das Problem ist, dass - zumindest für mich als unbeteiligten Betrachter - überhaupt kein Zusammenhang zwischen dem Hauptselect und den nachfolgenden Teilselects besteht. Und nebenbei verstehe ich den sachlichen Hintergrund nicht. Wie soll man da optimieren?

    Die einzige Möglichkeit, die mir einfällt (keine Ahnung, ob diese "Datenbank" das unterstützt und ob das was bringt):
    Code:
    SELECT YEAR(Datum) Jahr,..., (SELECT Gruppennr FROM Tabelle WHERE Datum='2007-12-01') Gruppe, ... FROM ...
    also die Teilabfragen als Spalten in die Hauptabfrage aufnehmen. Richtige DBMS können das - Voraussetzung ist, dass die Subselects immer genau einen Satz zurückliefern (nach Deiner Beschreibung aber zutreffend).

    Jan

  3. #3
    Registrierter Benutzer
    Registriert seit
    17.12.2005
    Beiträge
    300
    Hi Jan,

    beim Datenbankdesign gebe ich dir grundsätzlich recht. Es ist nicht optimal. Aber daran kann ich nichts ändern.

    Mein Beispiel oben war stark vereinfacht. Bei mir sind die Spalten/Inhalte anders. Fakt ist, dass diese Tabelle eine Sammelstelle für (redundante) Informationen ist, deren Berechnung sehr aufwändig und von vielen Parametern abhängig ist. Insofern ist es letztendlich nachvollziehbar, warum man sich für diesen Weg entschieden hat.

    Dein Vorschlag scheint mir brauchbar. Der funktioniert soweit auch. Dann kann ich das zumindest für jedes Jahr zusammenfassen. Wobei aber vermutlich trotzdem für jedes SELECT ein neuer Datenbankzugriff gemacht wird?!? Ich könnte mir vermutlich nur dadurch Rechenzeit sparen, weil alles in einem einzigen ResultSet zurückgegeben wird?!?

    Und ja, DBF kommt von DBASE. An relationale Datenbanken ist dabei nicht zu denken. Dafür kann man die DBF-Dateien "wunderbar" von Hand mit einem Texteditor bearbeiten *lol*

  4. #4
    Registrierter Benutzer
    Registriert seit
    07.05.2007
    Beiträge
    656
    Moin,

    Zitat Zitat von Hobbes Beitrag anzeigen
    ...Wobei aber vermutlich trotzdem für jedes SELECT ein neuer Datenbankzugriff gemacht wird?!? Ich könnte mir vermutlich nur dadurch Rechenzeit sparen, weil alles in einem einzigen ResultSet zurückgegeben wird?!?
    Das kann man ohne Blick hinter die Kulissen des Treibers nicht sagen. In einem "richtigen" DBMS übernimmt der Optimizer des Servers die Angelegenheit und sorgt (meist) dafür, das die Geschichte so optimal wie möglich abläuft. Wie oft und in welcher Form in Dbase auf die Dateien zugegriffen wird, ob das im Speicher oder auf Platte abläuft, wie optimiert wird - keine Ahnung. Läuft da überhaupt irgendein Serverprozess oder simuliert der Treiber nur DB-Abfragen über eine File-Schnittstelle?

    Jan

  5. #5
    Registrierter Benutzer
    Registriert seit
    17.12.2005
    Beiträge
    300
    Hi Jan,

    da bin ich auch überfragt. Ich bin jedenfalls froh, dass es überhaupt einen Treiber gibt, mit dem ich die üblichen SQL-Kommandos nutzen kann

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •