Avatar billede sunezapa Nybegynder
06. juni 2000 - 15:47 Der 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...?
Avatar billede ij Nybegynder
06. juni 2000 - 15:58 #1
select TOP(*) from tabelnavn
Avatar billede ij Nybegynder
06. juni 2000 - 15:58 #2
måske TOP 1 (*)
Avatar billede kresten Nybegynder
06. juni 2000 - 15:59 #3
SELECT top 1 * FROM minTable

Det kan bruges i SQL Server, men ikke i andre DBMS'er.
Avatar billede dmk Nybegynder
06. juni 2000 - 16:03 #4
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
Avatar billede sunezapa Nybegynder
06. juni 2000 - 16:09 #5
De' da nemt - når man lige husker det :-)

SELECT TOP 1 * FROM etc. DESC  giver sidste post :-)

ij & Kresten var lige huritge (indenfor 1 minut) så jeg deler point ligeligt...
Avatar billede blackthorne Nybegynder
06. juni 2000 - 16:13 #6
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
Avatar billede sunezapa Nybegynder
06. juni 2000 - 17:02 #7
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
Avatar billede dmk Nybegynder
06. juni 2000 - 17:11 #8
Jamen så har du da også et nøglefelt!

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.

DMK
Avatar billede dmk Nybegynder
06. juni 2000 - 17:13 #9
I øvrigt, hvis det kun er selve navnet du er intresseret i, så kan du helt slippe for at lave en select-i-select:

select max(NytDokNavn) from TABLE


DMK
Avatar billede sunezapa Nybegynder
06. juni 2000 - 17:57 #10
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 :-)  !
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