Einzelnen Beitrag anzeigen

nahpets
(Gast)

n/a Beiträge
 
#17

AW: Benötigte Zeit für einen Abfrage

  Alt 28. Dez 2013, 15:29
In Ermangelung einer entsprechenden Datenbank (und daher ungetestet) hier ein Vorschlag, wie er unter Oracle funktionieren könnte:
Delphi-Quellcode:
  select *
  from Tabelle1,
       Tabelle2,
       (Select Max(AAZaehler) As AAZaehler
        from Tabelle2
        where Kriterium = 'ID'
        and AAStatus <> 'Erledigt'
       ) MaxAAZaehler
  where Tabelle1.BNummer = Tabelle2.BNummer (+)
  and Tabelle1.Feld1 = '4EE'
  and Tabelle1.Feld2 = 'Frankfurt'
  and Tabelle2.aazaehler = MaxAAZaehler.aazaehler
  union
  select *
  from Tabelle1,
       Tabelle2,
       (Select Max(AAZaehler) As AAZaehler
        from Tabelle2
        where Kriterium = 'ID'
        and AAStatus <> 'Erledigt'
       ) MaxAAZaehler
  where Tabelle1.BNummer = Tabelle2.BNummer (+)
  and Tabelle1.Feld1 = '4EE'
  and Tabelle1.Feld2 = 'München'
  and Tabelle2.aazaehler = MaxAAZaehler.aazaehler;
Sofern die "Oraclevariante" nicht funktioniert eine View anlegen:
Delphi-Quellcode:
create view V_MaxAAZaehler as
Select Max(AAZaehler) As AAZaehler
from Tabelle2
where Kriterium = 'ID'
and AAStatus <> 'Erledigt'
und dieses SQL probieren:
Delphi-Quellcode:
select *
  from Tabelle1,
       Tabelle2,
       V_MaxAAZaehler
  where Tabelle1.BNummer = Tabelle2.BNummer
  and Tabelle1.Feld1 = '4EE'
  and Tabelle1.Feld2 = 'Frankfurt'
  and Tabelle2.aazaehler = V_MaxAAZaehler.aazaehler
  union
  select *
  from Tabelle1,
       Tabelle2,
       V_MaxAAZaehler
  where Tabelle1.BNummer = Tabelle2.BNummer
  and Tabelle1.Feld1 = '4EE'
  and Tabelle1.Feld2 = 'München'
  and Tabelle2.aazaehler = V_MaxAAZaehler.aazaehler
oder eventuell auch
Delphi-Quellcode:
select *
  from Tabelle1,
       Tabelle2,
       V_MaxAAZaehler
  where Tabelle1.BNummer = Tabelle2.BNummer
  and Tabelle1.Feld1 = '4EE'
  and (Tabelle1.Feld2 = 'Frankfurtor Tabelle1.Feld2 = 'München')
  -- bzw.
  -- and Tabelle1.Feld2 in ('Frankfurt','München')
  and Tabelle2.aazaehler = V_MaxAAZaehler.aazaehler
Konstrukte dieser Art: ... and Tabelle2.aazaehler = (Select Max(AAZaehler) from Tabelle2 AA where AA.BNummer = Tabelle1.BNummer... haben sich in der Vergangenheit bei meinen Implementierungen häufig als arge Flaschenhälse oder Perfomancekiller herausgestellt, so dass ich es tunlichst vermeide, derartige Konstrukte zu verwenden.
Je nach Datenbank und Cleverness des Optimierers kann es sein, dass das Subselect in der Wherebedingung je Datensatz ausgeführt wird. Hier kommen dann auch bei wenigen Millisekunden für die Ausführung des Subselectes für einen Datensatz, doch recht schnell sehr hohe Laufzeiten für ein paar tausend Datensätze heraus.

Geändert von nahpets (28. Dez 2013 um 15:31 Uhr) Grund: Schreib... und sonstige Fehler rausgemacht...
  Mit Zitat antworten Zitat