Announcement

Collapse
No announcement yet.

Suche nach Datensätzen, die NICHT existieren

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Suche nach Datensätzen, die NICHT existieren

    Hi,

    Ich habe da ein kleines Problem, ich habe eine Datenbank, in der verschiedene Nummern vergeben sind (leider als 10-stelliger String beginnend mit"4", das ist dann nochmal eine extra Schwierigkeit), und nun suche ich für die Generierung eines neuen Datensatzes eine Nummer, die noch nicht existiert. Wegen entsprechender Vorgaben (weil zwischendurch gelöschte wiederverwendet werden können) kann ich aber nicht einfach die größte Nummer +1 nehmen (davon abgesehen, dass Transact-SQL sich weigert eine 10-stellige Zifernfolge in eine Zahl umzuwandeln um 1 darauf zu addieren). Nun wollte ich nachfragen, ob es in SQL eine einfache Möglichkeit gibt, sich Strings generieren zu lassen, die einem bestimmten Muster folgen und in einer gegebenen Liste NICHT auftauchen.

    Als Neuling kommt mir erstmal die Idee, eine Tabelle mit allen möglichen Nummern aufzubauen, in der die belegten markiert sind, sozusagen als FreeMem-Liste dann kann ich suchen, welche in der einen Tabelle sind, aber nicht in der anderen; bei 10-stelligen Nummern, selbst wenn die erste Ziffer feststeht, hätte ich aber dann immer noch eine Datenbank von 1 Milliarde Einträgen, und das scheint mir dann doch etwas übertrieben, wenn man "nur" im Bereich von wenigen Tausend Nummern verwalten will. Eine andere Möglichkeit wäre, per VB in eine Schleife alle Nummern zu überprüfen, bis eine nicht existente gefunden wird, aber davon abgesehen, dass die Laufzeit dann von dem Füllstand der Datenbank abhängt, dauert das auch bei entsprechendem Füllstand grundsätzlich zu lange, als dass man es dem User zumuten könnte, deshalb hoffe ich, dass ich diese Arbeit durch eine SQL-Abfrage dem SQL-Server aufbürden kann.

    Ich hoffe, dass jemand, der etwas mehr Ahnung von SQL hat, hier die richtige Idee hat.

    Schon mal danke
    Martin Dietz

  • #2
    Hier würde sich eine SP anbieten, welche in einer schleife die Nummern erzeugt und auf Existenz prüft.

    Comment


    • #3
      Hallo Martin,

      beim Datentyp Integer hast Du mit 10-stelligen Zahlen mitunter Probleme, allerdings gibt es da noch Decimal! Vorschlag:
      Code:
      create table #daten (nummer char(10) not null)
      insert into #daten values('4000000001')
      insert into #daten values('4000000002')
      insert into #daten values('4000000003')
      insert into #daten values('4000000004')
      insert into #daten values('4000000040')
      insert into #daten values('4000000041')
      insert into #daten values('4000000042')
      insert into #daten values('4000000090')
      insert into #daten values('4000000095')
      
      select * from #daten
      
      create table #help (ID int identity primary key, nummer decimal(20, 0) not null)
      
      --aufsteigendes Einfügen
      insert into #help (nummer)
      select cast(nummer as decimal(20, 0))
      from #daten
      order by 1
      
      --self join für Lückenerkennung
      select a.nummer as MinNr, b.nummer as MaxNr, b.nummer - a.nummer - 1 as [Anzahl Nr zu verwenden]
      from #help a
      	inner join #help b on b.ID = a.ID + 1
      order by [Anzahl Nr zu verwenden] desc
      
      drop table #help
      drop table #daten
      So kannst Du die größten Lücken ermitteln und dann u.U. wieder ausfüllen. Allerdings ist diese Vorgehensweise nicht besonders elegant. Eine Tabelle sollte immer für die Eindeutigkeit eines Datensatzes eine Spalte mit einer eindeutigen Nummer besitzen, die allerdings keinerlei inhaltliche Bedeutung hat, da sie eben nur und ausschließlich für die Eindeutigkeit sorgt. Lücken sollten da absolut belanglos sein! Na ja, die Praxis...

      Gruß
      Olaf

      Comment


      • #4
        Danke ersteinmal für die Antworten, ich denke ich werde Olafs Antwort umsetzen, auch wenn das eine extra Tabelle verlangt, ist aber glaube ich schneller, die alte Help-Tabelle zu leeren und aus dem aktuellen Stand in Daten neu zu füllen, als eine SP zu starten, deren Laufzeit dann wieder davon abhängig ist, wann endlich mal eine Lücke gefunden wird. Außerdem ist die Lösung über Abfragen einfacher über das steuernde VB-Programm wartbar, als eine SP zu bearbeiten, für die man dann vermutlich wieder Zugriffsrechte braucht, die nur die OI hat...

        Gruß
        Martin Dietz

        Comment

        Working...
        X