AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Sql-Statement für kleinste nicht vorhanden Nummer
Thema durchsuchen
Ansicht
Themen-Optionen

Sql-Statement für kleinste nicht vorhanden Nummer

Ein Thema von barnti · begonnen am 17. Okt 2003 · letzter Beitrag vom 17. Okt 2003
Antwort Antwort
Seite 3 von 3     123   
NicoDE
(Gast)

n/a Beiträge
 
#21

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

  Alt 17. Okt 2003, 14:35
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 )
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#22

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

  Alt 17. Okt 2003, 15:55
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
  Mit Zitat antworten Zitat
barnti

Registriert seit: 15. Aug 2003
Ort: Mal hier mal da...
689 Beiträge
 
Delphi 7 Enterprise
 
#23

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

  Alt 17. Okt 2003, 16:16
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
  Mit Zitat antworten Zitat
barnti

Registriert seit: 15. Aug 2003
Ort: Mal hier mal da...
689 Beiträge
 
Delphi 7 Enterprise
 
#24

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

  Alt 17. Okt 2003, 16:38
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
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#25

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

  Alt 17. Okt 2003, 16:47
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).
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#26

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

  Alt 17. Okt 2003, 18:11
@barnti: merkst Du nicht, daß da keine Angabe der Datenbank vorhanden ist ?
Gruß
Hansa
  Mit Zitat antworten Zitat
barnti

Registriert seit: 15. Aug 2003
Ort: Mal hier mal da...
689 Beiträge
 
Delphi 7 Enterprise
 
#27

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

  Alt 17. Okt 2003, 19:27
@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
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#28

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

  Alt 17. Okt 2003, 19:40
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.
Gruß
Hansa
  Mit Zitat antworten Zitat
barnti

Registriert seit: 15. Aug 2003
Ort: Mal hier mal da...
689 Beiträge
 
Delphi 7 Enterprise
 
#29

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

  Alt 17. Okt 2003, 19:44
@Hansa danke für Dein Verständnis...

Gruß,

Barnti
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 3     123   


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 18:56 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