![]() |
Datenbank: ElevateDB • Version: 2.31 • Zugriff über: direkt
Select für Projekte mit Unterprojekten
Hallo SQL-Spezialisten,
ich habe eine Datenbanktabelle für eine hierarchische Struktur von Projekten. In der Tabelle gibt es ein Feld für die eigene Projektnummer (PROJ_NR) und ein Feld für die Nummer des übergeordneten Projektes (VORG). Die Nummern können beliebig sein, d.h. anhand der Projektnummer lässt sich die Zugehörigkeit zu einem bestimmten Projektzweig nicht feststellen. Jetzt brauche ich ein Select, das mir alle Projekte in einem Nummernbereich der oberen Ebene einschließlich aller Unterprojekte liefert. Beispiel:
Code:
Ein Select von 1000 bis 2000 soll jetzt alle diese Projekte liefern. Ich habe das momentan mit Hilfe einer serverseitigen Funktion gelöst, die zu einer Projektnummer die Nummer des Hauptprojekts auf der oberen Ebene zurückgibt:
1000
- aaaa - 12345 - 67890 - bbbb - cccc 2000 - xxxx - yyyy - bla - blub - zzzz
Code:
Diese Funktion wird dann beispielsweise folgendermaßen verwendet:
CREATE FUNCTION "MainVorg" (IN "aPrjNr" VARCHAR COLLATE "ANSI")
RETURNS VARCHAR COLLATE "ANSI" BEGIN DECLARE Vorg Varchar; DECLARE MainPrjNr VarChar; DECLARE ProjCursor CURSOR FOR stmtProj; PREPARE stmtProj FROM 'Select Vorg From Projekte Where PROJ_NR = ?'; Set Vorg = aPrjNr; Repeat Set MainPrjNr = Vorg; OPEN ProjCursor USING MainPrjNr; IF (ROWCOUNT(ProjCursor) > 0) THEN FETCH FIRST FROM ProjCursor ('Vorg') INTO Vorg; ELSE Set Vorg = ''; END IF; CLOSE ProjCursor; Until (Vorg='') or (Vorg is NULL) End Repeat; Return MainPrjNr; END
Code:
Das funktioniert auch, ist allerdings bei größeren Datenmengen etwas langsam. Habt ihr irgendwelche Ideen, wie man das optimieren könnte?
SELECT Projekte.PROJ_NR
FROM Projekte WHERE (MainVorg(Projekte.PROJ_NR) >= '1000') and (MainVorg(Projekte.PROJ_NR) <= '2000') |
AW: Select für Projekte mit Unterprojekten
Ich verstehe das vielleicht nicht ganz.
Du hast eine Funktion, die hauptsächlich ein Feld eines Datensatzes zurückliefert (vorg), dass Du aber auch so direkt auslesen könntest? Wegen der Langsamkeit: Ich weiß nicht, was ElevateDB kann und wie toll der Rechner ist, auf dem es läuft. Aber Projekte hat man idR nicht 10000e. Wie sieht es mit der Indizierung der Schlüsselfelder aus? Sind sie indiziert? Glaubst Du, sie sind indiziert? |
AW: Select für Projekte mit Unterprojekten
Nein, die Funktion gibt die Nr. des Stammprojektes auf der obersten Ebene zurück, also z. B. MainVorg('blub') = 2000
Die Indizierung ist eigentlich in Ordnung. |
AW: Select für Projekte mit Unterprojekten
Ok, nicht richtig hingeschaut.
Wieviel Datensätze sind es denn und wie tief sind die "schlimmsten" verschachtelt? Solche Selbstreferenzen bearbeitet man eigentlich mit CTE oder anderen (proprietären) rekursiven Verfahren oder Window Functions. Ob es sowas für ElevateDB gibt, weiß ich nicht. Vielleicht kann man jedenfalls die halbe Arbeit für die Engine sparen, indem man wenigsten die Bedingung umformuliert:
Code:
WHERE MainVorg(Projekte.PROJ_NR) between '1000' and '2000'
|
AW: Select für Projekte mit Unterprojekten
Danke, das mit dem between bringt schon was.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:38 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