AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Query-Optimierung

Ein Thema von hoika · begonnen am 5. Okt 2007 · letzter Beitrag vom 6. Okt 2007
Antwort Antwort
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#1

Query-Optimierung

  Alt 5. Okt 2007, 15:41
Datenbank: FB • Version: 1.5 • Zugriff über: egal
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
Heiko
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Query-Optimierung

  Alt 5. Okt 2007, 15:45
Schön mal mit Gruppierung versucht?
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#3

Re: Query-Optimierung

  Alt 5. Okt 2007, 15:46
Ist das nicht mit Gruppierung zu erreichen?

//Edit: etwas zu spät
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: Query-Optimierung

  Alt 6. Okt 2007, 08:35
Hall,

Gruppierung ist meine schwache Seite ...


Heiko
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: Query-Optimierung

  Alt 6. Okt 2007, 09:25
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
  Mit Zitat antworten Zitat
TBx
(Administrator)

Registriert seit: 13. Jul 2005
Ort: Stadthagen
1.893 Beiträge
 
Delphi 12 Athens
 
#6

Re: Query-Optimierung

  Alt 6. Okt 2007, 11:40
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
Thomas Breitkreuz
Gruß Thomas
- Admin DelphiPRAXIS
- Admin Delphi-Treff
- Embarcadero MVP
  Mit Zitat antworten Zitat
alex517

Registriert seit: 23. Nov 2004
Ort: Bernau b. Berlin
273 Beiträge
 
Delphi XE5 Enterprise
 
#7

Re: Query-Optimierung

  Alt 6. Okt 2007, 13:01
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
Alexander
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#8

Re: Query-Optimierung

  Alt 6. Okt 2007, 18:45
Hallo,

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


Heiko
Heiko
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:39 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