Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Query-Optimierung (https://www.delphipraxis.net/100924-query-optimierung.html)

hoika 5. Okt 2007 14:41

Datenbank: FB • Version: 1.5 • Zugriff über: egal

Query-Optimierung
 
Hallo #,

gegeben ist folgende Tabelle:

Id Integer (AutoInc)
PersonalId Integer (PersonalId)
StartDate Date
EndDate Date
GroupId (Id einer Gruppe)

Mit folgenden Einträgen

Id, PersonalId, StartDate, EndDate, GroupId
1, 1, '1.1.2007', '20.1.2007', 1
2, 10, '1.5.2007', '31.12.2007', 2
3, 1, '25.1.2007', '12.7.2007', 2

Jetzt benötige ich den Eintrag für ein bestimmtes Datum und PersonalId,
z.B. PersonalId 1, Datum '22.1.2007' -> Id 3, also der letzte Eintrag

Zur Zeit mache ich das so:
Select * From MyTable
Where (PersonalId=1) and (StartDate<='22.1.2007')
Order By StartDate Desc

der 1. Eintrag ist der gesuchte.

Das das aber für alle Personen gemacht werden soll,
habe ich das in eine SP ausgelagert.

Gefällt mir aber nicht so sehr.

Wie baut man denn so ne Query auf ohne SP ?

Danke


Heiko

mkinzler 5. Okt 2007 14:45

Re: Query-Optimierung
 
Schön mal mit Gruppierung versucht?

DeddyH 5. Okt 2007 14:46

Re: Query-Optimierung
 
Ist das nicht mit Gruppierung zu erreichen?

//Edit: etwas zu spät

hoika 6. Okt 2007 07:35

Re: Query-Optimierung
 
Hall,

Gruppierung ist meine schwache Seite ...


Heiko

Matze 6. Okt 2007 08:25

Re: Query-Optimierung
 
So könnte das aussehen, wenn ich nun keinen Denkfehler gemach habe.

SQL-Code:
SELECT * FROM MyTable
GROUP BY PersonalID, StartDate
ORDER BY StartDate DESC

TBx 6. Okt 2007 10:40

Re: Query-Optimierung
 
Zitat:

Zitat von Matze
So könnte das aussehen, wenn ich nun keinen Denkfehler gemach habe.

SQL-Code:
SELECT * FROM MyTable
GROUP BY PersonalID, StartDate
ORDER BY StartDate DESC

Moin!

Ein Fehler ist drin, es müssen alle Felder der Abfrage die kein subselect bzw. eine Agregatfunktion enthalten in der Group by clause stehen.
SQL-Code:
select PersonalId,
       GroupId,
       max (StartDate)
  from MyTable
  where StartDate <= :StartDate
  group by PersonalID, GroupID
Gruß

Thomas

alex517 6. Okt 2007 12:01

Re: Query-Optimierung
 
Hallo Heiko,

Mich wundert ein wenig, dass du zwar ein EndDate hast, dieses aber nicht auswertest.
Für der 22.01.2007 wäre laut deinen Daten PersonalId=1 in keiner Gruppe.

Wenn das EndDate keine Rolle spielt, warst du doch schon auf dem richtigen Weg,
es fehlte nur das First 1 da du ja nur eine Satz zurück haben möchtest:

SQL-Code:
Select First 1
  *
From
  MyTable
Where
  (PersonalId=1) and (StartDate<='22.1.2007')
Order By
  StartDate Desc

mit Auswertung des EndDates:
SQL-Code:
select first 1
  *
from
  MyTable H
where
  H.PERSONALID = :PERSONALID
  and
  (H.STARTDATE <= :DATUM) and (:DATUM <= H.ENDDATE)
ORDER by
  H.STARTDATE desc
in beiden Fälle empfiehlt sich ein Index
CREATE DESCENDING INDEX MYTABLE_IDX1 ON MYTABLE (PERSONAL_ID, STARTDATE);


alex

hoika 6. Okt 2007 17:45

Re: Query-Optimierung
 
Hallo,

danke erst mal.
Ja, das mit dem EndDate muss ich auch noch einbauen. *seufz*


Heiko


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:43 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz