Avatar billede baatmus Nybegynder
17. november 2003 - 10:57 Der er 10 kommentarer og
1 løsning

Find næste ledige nummer

Hvordan finder man via SQL det næste "hul" i en række af records med et løbenrfelt?

Eks:  Løbenr .....
      1025
      1026
      1028

Jeg angiver 1025 som udgangspunkt og vil gerne finde "hullet", hvor 1027 kan oprettes.
Avatar billede arne_v Ekspert
17. november 2003 - 11:11 #1
Du bliver nok nødt til at lave en SELECT løbenr og lade din applikation
finde hullet.

Normalt laver man feltet til IDENTITY og lever med huller.
Avatar billede cbp Nybegynder
17. november 2003 - 11:36 #2
Select Min(Løbenr)
from mytable
where løbenr > 1025 and not Løbenr in (select løbenr from mytable)
Avatar billede baatmus Nybegynder
17. november 2003 - 11:51 #3
cbp: Så vidt jeg kan se vil dit forslag altid give NULL, idet de 2 selects er fuldstædig ens.
Avatar billede cbp Nybegynder
17. november 2003 - 13:15 #4
Det har du fuldstændig ret i. Det gik lidt for hurtigt. Der er ingen anden mulighed end at bruge en cursor til at gennemløbe tabellen indtil den finder et hul men det er ikke særlig performancevenligt. Er der en grund til at du ikke kan bruge IDENTITY?
Avatar billede baatmus Nybegynder
17. november 2003 - 13:23 #5
Ja, jeg kan ikke bruge identity, fordi brugerne selv organiserer deres oplysninger i løbenr intervaller. Således har de behov for at gruppere records indenfor et løbenrinterval (eller startende med et givet løbenr) og dermed finde det førstkommende ledige nr efter den initielle værdi.
Avatar billede arne_v Ekspert
17. november 2003 - 13:40 #6
Så må du flytte logikken ud i applikationen.
Avatar billede baatmus Nybegynder
17. november 2003 - 13:45 #7
Ja, der er nok ikke andet for. Problemet er bare, at brugeren godt kan have serie på 1000+ entries og vil have næste ledige (1001). Der er i princippet ingen grænser. Det kan gå hen at blive rigtigt grimt, når jeg i princippet skal hente flere tusinde recs til mit dataset for at være på den sikre side :-(
Avatar billede arne_v Ekspert
17. november 2003 - 13:54 #8
En SELECT af et enkelt felt (evt. med en WHERE som angiver et interval
og feltet har index) er vel en af de billigste database operationer
overhovedet.
Avatar billede venne Nybegynder
17. november 2003 - 15:37 #9
Jeg har ikke testet den i alle sammenhænge, men prøv denne:

SELECT MIN(id) + 1
FROM tabel a
WHERE NOT EXISTS (SELECT id FROM tabel b WHERE b.id = a.id + 1)

Jeg kan ikke garantere for performance med rigtig mange rækker, men i det mindste foregår det hele på serveren.
Avatar billede baatmus Nybegynder
04. marts 2004 - 21:39 #10
Venne, jeg undskylder mange gange den sene reaktion, men takker for dit forslag som sidder lige i øjet. Jeg havde fundet ud af det selv, men det skal ikke komme dig til ulykke. Hvis du sender mig et svar skal jeg give dig de fortjente point.
Avatar billede venne Nybegynder
05. marts 2004 - 09:33 #11
Den havde jeg glemt alt om. Velbekomme.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester