Avatar billede encorez Nybegynder
21. april 2009 - 22:58 Der er 12 kommentarer og
2 løsninger

Delete med en select

Jeg har tabellen TEST. Der er én række hvor felten First er '1'. Og desuden at tid_start er dagen i dag. Jeg ønsker at slette alle række hvor tid_start (datetime) kommer før tid_start på den række hvor First er '1'.

Denne select virker. Her får jeg præcis de rækker hvor tid_start er før den tid_start hvor first='1'.
Select * from Test where tid_start < (SELECT tid_start FROM Test WHERE DATE(tid_start)=CURDATE() and first='1')

Men jeg ønsker ikke en select men en delete af samme rækker som ovenfor men det kan jeg ikke få til at virke på samme måde.

DELETE from Test where tid_start < (SELECT tid_start FROM Test WHERE DATE(tid_start)=CURDATE() and first='1')

Jeg får da fejlen:
#1093 - You can't specify target table 'Test' for update in FROM clause

Kan nogen fikse den?

Ellers må jeg først udtage resultatet af den inderste Select og derefter lave en ny query hvor jeg foretager sletningen. Men det ville være smartest at gøre det i et hug.
Avatar billede CCodam Nybegynder
21. april 2009 - 23:36 #1
Kan du ikke omskrive Select statementen sådan her:
Select * from Test where DATE(tid_start) < CURDATE() AND first='1'

Så altså Delete statementen kom til at se sådan her ud:
Delete from Test where DATE(tid_start) < CURDATE() AND first='1'
Avatar billede CCodam Nybegynder
21. april 2009 - 23:41 #2
Bare glem det, jeg er vist træt, det vil selvfølgelig ikke virke...

Men, jeg er lidt i tvivl om hvad det er du prøver på?
Vil du kun slette alle rækker der har en tid_start der er ældrere end den first='1' har? men kun hvis first='1' tid_start er CURDATE()?
Avatar billede encorez Nybegynder
22. april 2009 - 07:04 #3
Ja, jeg tror du forstår det rigtigt.
Jeg har en masse rækker hvor tid_start er både for i dag og kommende dage.
Jeg ønsker at slette alle rækker for i dag og alle kommende dage, MEN først fra et bestemt tidspunkt om morgen. Lad jeg os sige jeg for i dag har 50 rækker hvor tid_start er fra fra i dag mellem kl 01:00-05:00.
Så har jeg én rækker kl 06:00 hvor first er sat til 1. Det er fra og med den jeg ønsker rækkerne slettet.
Avatar billede CCodam Nybegynder
22. april 2009 - 08:53 #4
Hmm efter hvad du fortæller mig i #3 så burde < da være > ?

Men hvad med at lave det over to gange i så fald?

Først en select, hvor du henter datatime og gemmer den til en variable:
SELECT tid_start FROM Test WHERE DATE(tid_start)=CURDATE() and first='1'

Derefter en delete, hvor du sletter alle rækker der er større end variablen:
Select * from Test where tid_start > variable
Avatar billede encorez Nybegynder
22. april 2009 - 11:04 #5
Ja :), det er den nemme løsning som jeg også skriver i bunden af mit første indlæg

"Ellers må jeg først udtage resultatet af den inderste Select og derefter lave en ny query hvor jeg foretager sletningen. Men det ville være smartest at gøre det i et hug."

Jeg håbede på det kunne lade sig gøre på én gang. Jeg kan jo lave en select med en select inden i. Kan man ikke lave en delete med en select inden i??
Avatar billede CCodam Nybegynder
22. april 2009 - 11:29 #6
#5 Ja ok, undskyld, så ikke at du havde skrevet det ;)

Hmm måske er problemet at du åbner tabellen Test to gange, og derfor ikke kan slette den...prøv med følgende:

Select * from Test where tid_start < (SELECT Test.tid_start WHERE DATE(tid_start)=CURDATE() and first='1')
Avatar billede encorez Nybegynder
22. april 2009 - 11:36 #7
Er det ikke det jeg skriver i midten af mit første indlæg

"Denne select virker. Her får jeg præcis de rækker hvor tid_start er før den tid_start hvor first='1'.
Select * from Test where tid_start < (SELECT tid_start FROM Test WHERE DATE(tid_start)=CURDATE() and first='1')"

Har du læst mit første indlæg ;)  hehe, bare for sjov. Kom endelig med foreslag. Ellers springer jeg over hvor hegnet er lavest (og gør det af to gange)
Avatar billede encorez Nybegynder
22. april 2009 - 11:37 #8
og ja, problemet er sikkert at jeg laver en select midt i en delete, og det er der måske en konflikt ved så det slet ikke kan lade sig gøre
Avatar billede CCodam Nybegynder
22. april 2009 - 12:47 #9
#7/8 dig der ikke læser mig indlæg i #6 ordentligt...

Istedet for i anden select statement at bruge FROM Test, så kalder jeg bare Test fra den første Select statement, altså Test.tid_start

Delete from Test where tid_start < (SELECT tid_start FROM Test WHERE DATE(tid_start)=CURDATE() and first='1')"
Avatar billede CCodam Nybegynder
22. april 2009 - 12:48 #10
Så Prøv altså med:

Delete from Test where tid_start < (SELECT Test.tid_start WHERE DATE(tid_start)=CURDATE() and first='1')
Avatar billede encorez Nybegynder
22. april 2009 - 13:01 #11
Beklager, havde ikke set du havde ændret lidt i den.

Jeg har prøvet dit forslag men det virker ikke. Selv ikke bare select sætning virker. Både med og uden Delete tingen foran.

SELECT Test.tid_start WHERE DATE(tid_start)=CURDATE() and first='1'

Jeg får fejlen:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE DATE(Test.tid_start)=CURDATE() and first='1')' at line 1
Avatar billede CCodam Nybegynder
22. april 2009 - 13:42 #12
#11 Hmm :/ så har jeg desværre ikke flere bud :(
Avatar billede encorez Nybegynder
22. april 2009 - 14:34 #13
Helt i orden. Jeg tror ikke jeg finder en løsning og må bide i det sure æble. Læg et svar for din hjælp så deler vi i porten
Avatar billede CCodam Nybegynder
22. april 2009 - 14:46 #14
#13 Jeg kender det godt, prøver også så vidt muligt at gøre alt i SQL Statementen, før jeg manipulere via script...

Skal nok hive fat i dig, hvis jeg finder en anden løsning :/
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