![]() |
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 |
Re: Query-Optimierung
Schön mal mit Gruppierung versucht?
|
Re: Query-Optimierung
Ist das nicht mit Gruppierung zu erreichen?
//Edit: etwas zu spät |
Re: Query-Optimierung
Hall,
Gruppierung ist meine schwache Seite ... Heiko |
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 |
Re: Query-Optimierung
Zitat:
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:
Gruß
select PersonalId,
GroupId, max (StartDate) from MyTable where StartDate <= :StartDate group by PersonalID, GroupID Thomas |
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:
in beiden Fälle empfiehlt sich ein Index
select first 1
* from MyTable H where H.PERSONALID = :PERSONALID and (H.STARTDATE <= :DATUM) and (:DATUM <= H.ENDDATE) ORDER by H.STARTDATE desc CREATE DESCENDING INDEX MYTABLE_IDX1 ON MYTABLE (PERSONAL_ID, STARTDATE); alex |
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 20:40 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz