/ Forside / Teknologi / Udvikling / ASP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
ASP
#NavnPoint
smorch 9259
Harlekin 1866
molokyle 1040
Steffanst.. 758
gandalf 657
smilly 564
gibson 560
cumano 530
MouseKeep.. 480
10  Random 410
SQL, slet alle records over 100?
Fra : Jakob Munck


Dato : 20-11-03 06:19

Jeg har en gæstebog, hvor jeg gerne vil vise de sidste 100 indskrivninger,
og alle tidligere indskrivninger skal slettes løbende. Men hvordan er
SQL-syntaksen til dette?
Her er noget pseudokode:

SQL = "DELETE * FROM tbMeddelelser (bortset fra de 100 stk. med højest
id-nummer)
Conn.Execute(SQL)

Hvordan skrives det i rigtig SQL?

v.h.
Jakob Munck



 
 
Lars Hoffmann (20-11-2003)
Kommentar
Fra : Lars Hoffmann


Dato : 20-11-03 08:42


"Jakob Munck" <admin@seniorxxgroup.dk> escribió en el mensaje
news:3fbc4ebd$0$27399$edfadb0f@dread16.news.tele.dk...
> Jeg har en gæstebog, hvor jeg gerne vil vise de sidste 100
indskrivninger,
> og alle tidligere indskrivninger skal slettes løbende. Men hvordan
er
> SQL-syntaksen til dette?
> Her er noget pseudokode:
>
> SQL = "DELETE * FROM tbMeddelelser (bortset fra de 100 stk. med
højest
> id-nummer)
> Conn.Execute(SQL)
>
> Hvordan skrives det i rigtig SQL?

God øvelse, prøv noget i stil med (burde virke i ACCESS):

DELETE * FROM tbMeddelelser WHERE id NOT IN (SELECT TOP 100 id FROM
tbMeddelelser ORDER BY ID DESC)



Jens Gyldenkærne Cla~ (20-11-2003)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 20-11-03 12:50

Lars Hoffmann skrev:

> God øvelse, prøv noget i stil med (burde virke i ACCESS):
>
> DELETE * FROM tbMeddelelser WHERE id NOT IN (SELECT TOP 100 id
> FROM tbMeddelelser ORDER BY ID DESC)

Hvis id er fortløbende, kan man nøjes med at sammenligne med id-
værdien på nr. 100:

DELETE *
FROM tbMeddelelser
WHERE id < (SELECT TOP 1 id FROM
           (SELECT TOP 100 id
           FROM tbMeddelelser
           ORDER BY id DESC) as t
        ORDER BY id ASC)

(utestet)!

Jeg vil tro at ovenstående skulle køre hurtigere end en NOT IN-
udgave - fordi NOT IN skal sammenligne langt flere værdier, men jeg
ved det ikke.

I databaser der understøtter LIMIT, kan det gøres enklere - men da
mysql, den mest almindelige asp-database udover Access - til
gengæld ikke understøtter subselects, hjælper det ikke så meget.
--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html

Lars Hoffmann (20-11-2003)
Kommentar
Fra : Lars Hoffmann


Dato : 20-11-03 12:57

"Jens Gyldenkærne Clausen" <jens@gyros.invalid> escribió

> Jeg vil tro at ovenstående skulle køre hurtigere end en NOT IN-
> udgave - fordi NOT IN skal sammenligne langt flere værdier, men jeg
> ved det ikke.

Du kan ikke bruge en subselect uden at bruge enten IN eller NOT IN.
En < som sammenligning til en subselect giver ikke mening (omend du
kun har 1 record i resultatet til din subselect)



Jakob Munck (20-11-2003)
Kommentar
Fra : Jakob Munck


Dato : 20-11-03 17:32


> DELETE * FROM tbMeddelelser WHERE id NOT IN (SELECT TOP 100 id FROM
> tbMeddelelser ORDER BY ID DESC)
>

Sætningen virker strålende. Tak for det!

v.h.
Jakob



Jens Gyldenkærne Cla~ (20-11-2003)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 20-11-03 18:08

Lars Hoffmann skrev:

> Du kan ikke bruge en subselect uden at bruge enten IN eller
> NOT IN.

Jo.


> En < som sammenligning til en subselect giver ikke
> mening (omend du kun har 1 record i resultatet til din
> subselect)

Den giver mening hvis (og kun hvis) subselect'en returnerer præcis
én post.

Prøv at køre følgende forespørgsel i eksempeldatabasen Northwind:

SELECT Kategorinavn
FROM kategorier
WHERE kategorinr < (SELECT max(kategorinr) from kategorier)
--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html

Lars Hoffmann (21-11-2003)
Kommentar
Fra : Lars Hoffmann


Dato : 21-11-03 09:31

"Jens Gyldenkærne Clausen" <jens@gyros.invalid> escribió

> SELECT Kategorinavn
> FROM kategorier
> WHERE kategorinr < (SELECT max(kategorinr) from kategorier)

Du har ret, det virker.



Kasper Katzmann (20-11-2003)
Kommentar
Fra : Kasper Katzmann


Dato : 20-11-03 08:41

Jakob Munck skrev:
> Jeg har en gæstebog, hvor jeg gerne vil vise de sidste 100
> indskrivninger, og alle tidligere indskrivninger skal slettes
> løbende. Men hvordan er SQL-syntaksen til dette?
> Her er noget pseudokode:
>
> SQL = "DELETE * FROM tbMeddelelser (bortset fra de 100 stk. med højest
> id-nummer)
> Conn.Execute(SQL)
>
> Hvordan skrives det i rigtig SQL?

sql = "DELETE FROM tbMeddelelser WHERE Dit_Id_Felt < 100"
Conn.Execute(SQL)



--
Mvh
Kasper Katzmann
Katzmann Consulting
http://www.katzmann.dk



Lars Hoffmann (20-11-2003)
Kommentar
Fra : Lars Hoffmann


Dato : 20-11-03 09:09

"Kasper Katzmann" <kasper@fjerndettekatzmann.dk> escribió

> sql = "DELETE FROM tbMeddelelser WHERE Dit_Id_Felt < 100"

Nej, den vil ikke slette alle undtagen de hunrede med højeste ID, den
vil slette alle der har et id mindre end 100 - det er ikke det samme



Kasper Katzmann (20-11-2003)
Kommentar
Fra : Kasper Katzmann


Dato : 20-11-03 09:56

Lars Hoffmann skrev:
> "Kasper Katzmann" <kasper@fjerndettekatzmann.dk> escribió
>
>> sql = "DELETE FROM tbMeddelelser WHERE Dit_Id_Felt < 100"
>
> Nej, den vil ikke slette alle undtagen de hunrede med højeste ID, den
> vil slette alle der har et id mindre end 100 - det er ikke det samme

Yep, så det først da jeg havde sendt svaret

--
Mvh
Kasper Katzmann
Katzmann Consulting
http://www.katzmann.dk



Søg
Reklame
Statistik
Spørgsmål : 177501
Tips : 31968
Nyheder : 719565
Indlæg : 6408527
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste