Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Sql-Statement für kleinste nicht vorhanden Nummer (https://www.delphipraxis.net/10379-sql-statement-fuer-kleinste-nicht-vorhanden-nummer.html)

NicoDE 17. Okt 2003 14:35

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 :))

Jelly 17. Okt 2003 15:55

Re: Sql-Statement für kleinste nicht vorhanden Nummer
 
Hier wäre eine Lösung
Code:
select min(ID+1) as FreieID from Tabelle
where not (ID+1 in (Select ID from Tabelle))
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.

Gruß,
Tom

barnti 17. Okt 2003 16:16

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:

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;
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....

Wie gesagt: sind kompliziertere Bedingungen....

Danke für die rege Beteiligung, Gruß,

Barnti

barnti 17. Okt 2003 16:38

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:

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;
Da kommt aufgrund der Rahmenbed. noch einiges hinzu...

Danke für die rege Beteiligung,

Barnti

NicoDE 17. Okt 2003 16:47

Re: Sql-Statement für kleinste nicht vorhanden Nummer
 
Zitat:

Zitat von Jelly
Hier wäre eine Lösung [...]

Ich hatte vergessen zu erwähnen, dass es bei diesem Ansatz einen Sonderfall gibt - wenn die Tabelle leer ist (wir haben damals ID=0 -Datensätze beim Erzeugen der Tabelle angelegt, da wir diese ohnehin brauchten).


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).

Hansa 17. Okt 2003 18:11

Re: Sql-Statement für kleinste nicht vorhanden Nummer
 
@barnti: merkst Du nicht, daß da keine Angabe der Datenbank vorhanden ist ?

barnti 17. Okt 2003 19:27

Re: Sql-Statement für kleinste nicht vorhanden Nummer
 
@Hansa: Wie lautet Deine Frage?
Zitat:

merkst Du nicht, daß da keine Angabe der Datenbank vorhanden ist ?
Zitat:

da
bedeutet?

und

Zitat:

Angabe der DB
heißt?

Bitte drück Dich doch etwas klarer aus...

Gruß,

Barnti

Hansa 17. Okt 2003 19:40

Re: Sql-Statement für kleinste nicht vorhanden Nummer
 
Zitat:

Zitat von barnti
Bitte drück Dich doch etwas klarer aus...

Da du das nicht mal verstanden hast, sehe ich, daß es keinen Sinn hat, Dir den Trigger zu erklären, sofern das bei deiner DB überhaupt geht.

barnti 17. Okt 2003 19:44

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.
Seite 3 von 3     123   

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