![]() |
Re: Sql-Statement für kleinste nicht vorhanden Nummer
Möglicher Lösungsansatz: im Statement eine Menge A mit allen ID und eine Menge B mit allen ID+1 generieren und so verbinden, dass als Ergebnismenge nur alle B zurückgeben werden, die nicht in A enthalten sind - der kleinste Wert ist die gesuchte 'freie' ID.
Das Problem dabei ist, das dies damals (vor ca. vier Jahren) nur mit Oracle in _einem_ SQL-Statement möglich war, und somit performant auf dem Server optimiert werden konnte. Ansonsten lies die Hinweise von woki, sonst wirst Du früher oder später Probleme bekommen... Gruß Nico ps: ist zu lange her, als dass ich das o.g. Statement noch zusammenbekommen würde (hat meinen Kollegen ein paar Tage gekostet darauf zu kommen :)) |
Re: Sql-Statement für kleinste nicht vorhanden Nummer
Hier wäre eine Lösung
Code:
Voraussetzung, die Datenbankengine unterstützt die Syntax. Bei MySQL gehts glaub ich nicht. Allerdings soll die neueste Version jetzt Subqueries unterstützen, hab die aber nicht installiert. Kann ja mal einer ausprobieren und hier berichten.
select min(ID+1) as FreieID from Tabelle
where not (ID+1 in (Select ID from Tabelle)) Gruß, Tom |
Re: Sql-Statement für kleinste nicht vorhanden Nummer
Hallo Leute,
das ist alles ganz ok nur kommen bei mir noch einige randbedingungen hinzu. Ich löse das jetzt folgendermassen: Es gibt zwei Tabellen: Eine Stück-Tabelle, also die mit der gearbeitet wird und eine Pool Tabelle, in der sich alle freien IDs befinden. Wird nun in der Stücktabelle ein Datensatz angelegt so wird inkrementell geschaut, ob die ID bereits vorhanden Ist. Etwa so
Delphi-Quellcode:
So erzeuge ich eine ID die möglichst unter 1000 liegt. Werte die in der StückTabelle entfernt werden, werden mit einem Ende Datum versehen, das ein Teil des Schlüssels ist....Fuction IDErzeugen(ID: String): String; begin if ID < 1000 then begin if Query.locate(nummer) then result:= nummer; else result:= IDErzeugen(Nummer+1); end else begin result:= FindeIDInPool(nummer); end end; Function FindeIDInPool(Nummer: String): String; begin try QueryPool.locate except result:= nummer+1; end; end; Wie gesagt: sind kompliziertere Bedingungen.... Danke für die rege Beteiligung, Gruß, Barnti |
Re: Sql-Statement für kleinste nicht vorhanden Nummer
Hallo Leute,
das ist alles ganz ok nur kommen bei mir noch einige randbedingungen hinzu. Ich löse das jetzt folgendermassen: Es gibt zwei Tabellen: Eine Stück-Tabelle, also die mit der gearbeitet wird und eine Pool Tabelle, in der sich alle freien IDs befinden. Wird nun in der Stücktabelle ein Datensatz angelegt so wird inkrementell geschaut, ob die ID bereits vorhanden Ist. Etwa so
Delphi-Quellcode:
Da kommt aufgrund der Rahmenbed. noch einiges hinzu...Fuction IDErzeugen(ID: String): String; begin if ID < 1000 then begin if Query.locate(nummer) then result:= nummer; else result:= IDErzeugen(Nummer+1); end else begin result:= FindeIDInPool(nummer); end end; Function FindeIDInPool(Nummer: String): String; begin try QueryPool.locate except result:= nummer+1; end; end; Danke für die rege Beteiligung, Barnti |
Re: Sql-Statement für kleinste nicht vorhanden Nummer
Zitat:
Gruß Nico ps: um die Query-Performance zu optimieren, kann ich nur empfehlen, die jeweiligen Trace-Möglichkeiten zu nutzen (im Falle von Oracle z.B. EXPLAIN PLAN). |
Re: Sql-Statement für kleinste nicht vorhanden Nummer
@barnti: merkst Du nicht, daß da keine Angabe der Datenbank vorhanden ist ?
|
Re: Sql-Statement für kleinste nicht vorhanden Nummer
@Hansa: Wie lautet Deine Frage?
Zitat:
Zitat:
und Zitat:
Bitte drück Dich doch etwas klarer aus... Gruß, Barnti |
Re: Sql-Statement für kleinste nicht vorhanden Nummer
Zitat:
|
Re: Sql-Statement für kleinste nicht vorhanden Nummer
@Hansa danke für Dein Verständnis...
Gruß, Barnti |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:14 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