06. juni 2000 - 15:47Der er
8 kommentarer og 2 løsninger
Hente tabellens sidste post via SQL?
Kan man via SQL hente den sidste post i databasen? - altså uden at skulle hente hele møget ind i et recordset og bruge f.eks. .movelast, hvilket er vildt RAM-krævende...?
Hvordan definerer du "den sidste post"? Records i en database ligger jo ikke i nogen fast rækkefølge, og en rækkefølge af records kan udelukkende defineres af at index. Hvis du har et index på tabellen, og dette index i øvrigt er unikt (dvs. kombinationen af de felter der er lavet index på kan altid garanteres at identificere en record unikt), så kan det godt lade sig gøre. Lad os sige du har et unikt index på et enkelt felt, id.
select * from TABLE where id in (select max(id) from TABLE)
Nu kender jeg så ikke dine data, så kan det lade sig gøre?
DMK har ret, du er ude i at vil lave en løsning, som for det første ikke er professionel, og for det andet er det forkert at skrive en select der returner mange rækker hvis man kun vil have en række (det er derimod et tegn på at select ikke er funktionel korrekt).
Men hvis du virkelig, vil forsætte af samme løsning kan du select sidste række på denne måde select top 1 from tabelnavn order by felt desc
Dog bør du hellere holde dig til en løsning ala dmk. ogsa for performancen skyld
Well, i denne sag er der netop IKKE noget brugbart ID, og da det kun er "programmet" (VB) som genererer poster, så har jeg helt styr på hvilke poster der er... Konkret drejer det sig om dokumentnavne, som genereres ud fra forrige dokumentnavn: TABLE!DokNavn hentes og TABLE!NytDokNavn generes, f.eks. bliver ABC0023 til ABC0024 (.doc) Det virker fint med TOP 1 - og jeg håber at performance er iorden - sammenlignet med f.eks. at hente et helt recordset ind hver gang (som den tidligere programmør havde gjort)...? Sune
Hvis dokumentnavn altid fungerer så den blot forøger tallet til sidst i navnet, så er navnet altid unikt, og mere vigtigt, hvis det sorteres vil det sidst-genereret altid stå sidst.
Så du kan løse din forspørgsel sådan:
select * from table where nytdoknavn in (select max(nytdoknavn) from table)
Uden dog at vide det, så vil jeg tro dette er langt mere effektivt end det andet, og det er mere "rigtigt" i forhold til SQL-standarden. Jeg har aldrig hørt om TOP, og ved ikke hvad den egentlig gør, men hvis du engang ville flytte din database til noget andet, vil du ikke kunne flytte din kode uden at skulle ændre i den.
Genialt! dokumentnavn er ikke kun et tal, men en kombination af Bogstaver og Tal, - men det virker jo lige fint med sidstnævnte, og hvis TOP 1 ikke virker på en SQL-server så er det da ud med den måde :-)
TOP 25 * from Table returnerer iøvrigt de første 25 poster, og TOP 25% returnerer de højeste 25%...
Tak for Hjælpen - må lytte mere til de længere svar næste gang :-) !
Synes godt om
Ny brugerNybegynder
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.