|
| SQL Delete .. problem Fra : Thomas Schulz |
Dato : 02-05-02 11:43 |
|
Jeg har ikke været i stand til at finde et "Delete" eksempel der bare minde
lidt om det jeg ønsker.
Jeg bruger MySql 3.x serien (understøtter ikke cascading). Jeg vil helst
have SQL skal være kompatibel med andre dbs.
Den kode jeg har her virker ikke og er nok meget forkert, men den forklarer
hvad jeg vil meget godt:
DELETE FROM accountsall,accountstoactivate
WHERE accountsall.AccountID = accountstoactivate.AccountID
AND accountstoactivate.Stamp < DATE_SUB(NOW(), INTERVAL 48 HOUR)
Det er også ok hvis jeg er nødt til at splitte det op i 2 Delete for at
slette i 2 tabeller.
Kan nogen hjælpe (forklaring, råd, url, etc.)?
mvh
Thomas
| |
Jesper Frank Nemholt (02-05-2002)
| Kommentar Fra : Jesper Frank Nemholt |
Dato : 02-05-02 12:15 |
|
"Thomas Schulz" <dk_sz@hotmail.com> wrote in message
news:3cd1189c$0$18597$edfadb0f@dspool01.news.tele.dk...
> Jeg har ikke været i stand til at finde et "Delete" eksempel der bare
minde
> lidt om det jeg ønsker.
> Jeg bruger MySql 3.x serien (understøtter ikke cascading). Jeg vil helst
> have SQL skal være kompatibel med andre dbs.
> Den kode jeg har her virker ikke og er nok meget forkert, men den
forklarer
> hvad jeg vil meget godt:
>
>
> DELETE FROM accountsall,accountstoactivate
> WHERE accountsall.AccountID = accountstoactivate.AccountID
> AND accountstoactivate.Stamp < DATE_SUB(NOW(), INTERVAL 48 HOUR)
Din date sub er jeg ikke sikker på virker i MySQL....men det er muligvis
bare fordi jeg ikke kender den
Jeg ville prøve med :
DELETE FROM accountsall,accountstoactivate WHERE accountsall.AccountID =
accountstoactivate.AccountID
AND accountstoactivate.Stamp < now() - INTERVAL 48 HOUR;
/Jesper
| |
Thomas Schulz (02-05-2002)
| Kommentar Fra : Thomas Schulz |
Dato : 02-05-02 13:23 |
|
> Din date sub er jeg ikke sikker på virker i MySQL....men det er muligvis
> bare fordi jeg ikke kender den
> Jeg ville prøve med :
Den er understøttet, anyway, jeg vil bruge dit eksempel fra nu af.. Det
virker nu heller ikke...
Her er det:
"
DELETE FROM accountsall,accountstoactivate
WHERE accountsall.AccountID = accountstoactivate.AccountID AND
accountstoactivate.Stamp < now() - INTERVAL 48 HOUR
"
Som giver fejl:
Error: 1064 - You have an error in your SQL syntax near 'accountstoactivate
WHERE accountsall.AccountID = accountstoactivate.AccountID AN' at line 1
mvh
Thomas
| |
Jens Gyldenkærne Cla~ (02-05-2002)
| Kommentar Fra : Jens Gyldenkærne Cla~ |
Dato : 02-05-02 13:47 |
|
"Thomas Schulz" <dk_sz@hotmail.com> skrev:
> DELETE FROM accountsall,accountstoactivate
> WHERE accountsall.AccountID = accountstoactivate.AccountID
> AND accountstoactivate.Stamp < DATE_SUB(NOW(), INTERVAL 48
> HOUR)
Du kan ikke slette fra to tabeller på en gang.
> Det er også ok hvis jeg er nødt til at splitte det op i 2
> Delete for at slette i 2 tabeller.
Det er nemlig lige hvad du skal.
Nedenstående syntaks virker i MS SQL - ved ikke med mySQL, men prøv
engang.
Prøv med:
DELETE FROM a
FROM accountsall a INNER JOIN accountstoactivate b
ON a.AccountID = b.AccountID
WHERE b.Stamp < DATE_SUB(NOW(), INTERVAL 48 HOUR)
DELETE FROM accountstoactivate
WHERE Stamp < DATE_SUB(NOW(), INTERVAL 48 HOUR)
Husk at rækkefølgen er vigtig.
--
Jens Gyldenkærne Clausen
MF (medlem af FIDUSO - www.fiduso.dk)
| |
Thomas Schulz (02-05-2002)
| Kommentar Fra : Thomas Schulz |
Dato : 02-05-02 18:44 |
|
> Prøv med:
>
> DELETE FROM a
> FROM accountsall a INNER JOIN accountstoactivate b
> ON a.AccountID = b.AccountID
> WHERE b.Stamp < DATE_SUB(NOW(), INTERVAL 48 HOUR)
Tak. Det virker desværre ikke (er det meningen der skal være 2 from?).
Jeg har så søgt nettet igen (bliver nok nødt til at få mig en bog), prøvet
mig frem (med udgangspunkt i din kode) etc.
For at teste for simple fejl har jeg gjort følgende:
Virker fint (simpel test for at teste e.g. NOW, Interval etc.)
------------------------------------
SELECT a.* FROM accountsall a, accountstoactivate b
WHERE a.AccountID = b.AccountID
AND b.Stamp > Now() - INTERVAL 48 HOUR
Melder fejl: Error: 1064 - You have an error in your SQL syntax near 'a FROM
accountsall a INNER JOIN accountstoactivate b ON a.AccountID = b.Account' at
line 1
-------------------------------------------------
DELETE a FROM accountsall a INNER JOIN accountstoactivate b
ON a.AccountID = b.AccountID
AND b.Stamp < Now() - INTERVAL 48 HOUR
mvh
Thomas
| |
Ulrik Lunddahl (02-05-2002)
| Kommentar Fra : Ulrik Lunddahl |
Dato : 02-05-02 20:08 |
|
"Jens Gyldenkærne Clausen" <jc@dmf.dk> wrote:
> Prøv med:
>
> DELETE FROM a
> FROM accountsall a INNER JOIN accountstoactivate b
> ON a.AccountID = b.AccountID
> WHERE b.Stamp < DATE_SUB(NOW(), INTERVAL 48 HOUR)
Det ligner en typo:
DELETE FROM
accountsall a
INNER JOIN
accountstoactivate b
ON
a.AccountID = b.AccountID
WHERE
b.Stamp < DATE_SUB(NOW(), INTERVAL 48 HOUR)
Min SQL notation med indrykning har mange gange vist sig at være praktisk.
--
Med Venlig Hilsen
Ulrik Lunddahl - nospam037@lunddahl.dk
My heroes: Heddy Lamar & George Antheil
| |
Jens Gyldenkærne Cla~ (02-05-2002)
| Kommentar Fra : Jens Gyldenkærne Cla~ |
Dato : 02-05-02 23:07 |
|
"Ulrik Lunddahl" <nospam037@lunddahl.dk> skrev:
> Det ligner en typo:
Den er godt nok ikke testet, men den er nu god nok med 2 x FROM.
Se f.eks.
www.devguru.com/Technologies/sqlsyntax/quickref/sql_syntax_delete.html
Men det er muligt at alias ikke er understøttet i den første FROM.
Prøv med:
DELETE FROM accountsall
FROM accountsall A INNER JOIN
accountstoactivate b
ON
a.AccountID = b.AccountID
WHERE
b.Stamp < DATE_SUB(NOW(), INTERVAL 48 HOUR)
Hvis alias ikke virker kan de udelades - det kræver bare lidt
mere skrivearbejde.
Hvis den dobbelte FROM-syntaks ikke virker kan du opnå noget af
det samme med en subselect:
DELETE FROM accountsall
WHERE AccountID IN (SELECT AccountID FROM accountstoactivate
WHERE Stamp < DATE_SUB(NOW(), INTERVAL 48 HOUR))
> Min SQL notation med indrykning har mange gange vist sig at
> være praktisk.
Det er guld værd at formatere SQL-sætninger pænt.
--
Jens Gyldenkærne Clausen
MF (Medlem af Fiduso - www.fiduso.dk)
| |
Ulrik Lunddahl (02-05-2002)
| Kommentar Fra : Ulrik Lunddahl |
Dato : 02-05-02 23:27 |
|
"Jens Gyldenkærne Clausen" <gyros@email.dk> wrote:
> Den er godt nok ikke testet, men den er nu god nok med 2 x FROM.
Tja, jeg er ikke en haj, og i dag lærte jeg noget nyt, jeg reflekterede
udelukkende på de 2 x FROM som jeg aldrig har hørt om før.
Min rettede og pænt formaterede kode fungerer sikkert også godt nok, bare
som den var tiltænkt...
> Det er guld værd at formatere SQL-sætninger pænt.
Ja, se bare, hvis du havde gjort det ordenligt havde jeg ikke dummet mig så
grusomt...
--
Med Venlig Hilsen
Ulrik Lunddahl - nospam037@lunddahl.dk
My heroes: Heddy Lamar & George Antheil
| |
Jens Gyldenkærne Cla~ (03-05-2002)
| Kommentar Fra : Jens Gyldenkærne Cla~ |
Dato : 03-05-02 11:10 |
|
"Ulrik Lunddahl" <nospam037@lunddahl.dk> skrev:
> Min rettede og pænt formaterede kode fungerer sikkert også
> godt nok, bare som den var tiltænkt...
Jeg har ikke hørt om nogen SQL-systemer der accepterer en DELETE-
sætning direkte på et JOIN - så jeg tillader mig at tvivle.
>> Det er guld værd at formatere SQL-sætninger pænt.
>
> Ja, se bare, hvis du havde gjort det ordenligt havde jeg ikke
> dummet mig så grusomt...
Du mener hvis jeg havde gjort det på din måde. Jeg ville måske
have indrykket "ON"-delen i eksemplet - men absolut ikke mere.
INNER JOIN forbinder to led - derfor vil jeg helst have <a>
INNER JOIN <b> på én linje.
--
/jens
| |
Thomas Schulz (03-05-2002)
| Kommentar Fra : Thomas Schulz |
Dato : 03-05-02 10:01 |
|
> Se f.eks.
> www.devguru.com/Technologies/sqlsyntax/quickref/sql_syntax_delete.html
Tak for link.
> Men det er muligt at alias ikke er understøttet i den første FROM.
>
> Prøv med:
>
> DELETE FROM accountsall
> FROM accountsall A INNER JOIN
> accountstoactivate b
> ON
> a.AccountID = b.AccountID
> WHERE
> b.Stamp < DATE_SUB(NOW(), INTERVAL 48 HOUR)
Virker ikke
Jeg rettetde også "A" til "a" for a sikre det ikke var problemet (plus
bagefter igen undlod Date_Sub funktionen), i.e:
--
DELETE FROM accountsall
FROM accountsall a
INNER JOIN accountstoactivate b
ON a.AccountID = b.AccountID
WHERE b.Stamp < Now() - INTERVAL 48 HOUR
> DELETE FROM accountsall
> WHERE AccountID IN (SELECT AccountID FROM accountstoactivate
> WHERE Stamp < DATE_SUB(NOW(), INTERVAL 48 HOUR))
Men MySql understøter ikke nestede Selects (AFAIK). Det virker i hvert fald
ikke.
mvh
Thomas
| |
Jens Gyldenkærne Cla~ (03-05-2002)
| Kommentar Fra : Jens Gyldenkærne Cla~ |
Dato : 03-05-02 11:15 |
|
"Thomas Schulz" <dk_sz@hotmail.com> skrev:
>> Men det er muligt at alias ikke er understøttet i den første
>> FROM.
>>
>> Prøv med:
[klip]
> Virker ikke
Har du prøvet helt uden alias?
***
DELETE FROM accountsall
FROM accountsall INNER JOIN
accountstoactivate
ON
accountsall.AccountID = accountstoactivate.AccountID
WHERE
accountstoactivate.Stamp < DATE_SUB(NOW(), INTERVAL 48 HOUR)
***
Desværre tror jeg mere det er den dobbelte FROM (og ikke
aliaserne) der savner understøttelse i mySQL.
> Men MySql understøter ikke nestede Selects (AFAIK).
Det har du vist ret i.
Har du overvejet et andet RDBMS ?
/Jens
| |
Jens Gyldenkærne Cla~ (03-05-2002)
| Kommentar Fra : Jens Gyldenkærne Cla~ |
Dato : 03-05-02 22:34 |
|
"Thomas Schulz" <dk_sz@hotmail.com> skrev:
> Men MySql understøter ikke nestede Selects (AFAIK). Det virker
> i hvert fald ikke.
Her kommer lige et dumt spørgsmål: Har du kigget i manualen? Jeg
fandt en mySQL-manual på nettet - her er syntaksen for DELETE:
(fra http://www.mysql.com/doc/D/E/DELETE.html)
****
DELETE [LOW_PRIORITY | QUICK] FROM table_name
[WHERE where_definition]
[ORDER BY ...]
[LIMIT rows]
or
DELETE [LOW_PRIORITY | QUICK] table_name[.*] [,table_name[.*]
....]
FROM table-references
[WHERE where_definition]
or
DELETE [LOW_PRIORITY | QUICK]
FROM table_name[.*], [table_name[.*] ...]
USING table-references
[WHERE where_definition]
****
Længere nede står der:
****
The first multi-table delete format is supported starting from
MySQL 4.0.0. The second multi-table delete format is supported
starting from MySQL 4.0.2.
The idea is that only matching rows from the tables listed before
the FROM or before the USING clause are deleted. The effect is
that you can delete rows from many tables at the same time and
also have additional tables that are used for searching.
The .* after the table names is there just to be compatible with
Access:
DELETE t1,t2 FROM t1,t2,t3 WHERE t1.id=t2.id AND t2.id=t3.id
or
DELETE FROM t1,t2 USING t1,t2,t3 WHERE t1.id=t2.id AND
t2.id=t3.id
In the above case we delete matching rows just from tables t1 and
t2.
****
--
Jens Gyldenkærne Clausen
MF (Medlem af Fiduso - www.fiduso.dk)
| |
Thomas Schulz (03-05-2002)
| Kommentar Fra : Thomas Schulz |
Dato : 03-05-02 22:43 |
|
> Her kommer lige et dumt spørgsmål: Har du kigget i manualen? Jeg
> fandt en mySQL-manual på nettet - her er syntaksen for DELETE:
Yep, men som der står, så er 2 af dem (dem der er multi-table) 4.x syntax.
AFAIK Viborgnet.dk (som er hvor jeg har mit website liggende hos) bruger
vist 3.x serien
Jeg går så ud fra man skulle tror den første:
"
> DELETE [LOW_PRIORITY | QUICK] FROM table_name
> [WHERE where_definition]
> [ORDER BY ...]
> [LIMIT rows]
"
ville virke (siden det er den af de 3 der ikke er multi-tabel),
i.e.
DELETE FROM accountsall
WHERE accountsall.AccountID = accountstoactivate.AccountID
AND accountstoactivate.Stamp < Now() - INTERVAL 48 HOUR
Men der får jeg fejl:
Error: 1109 - Unknown table 'accountstoactivate' in where clause
mvh
Thomas
| |
Jens Gyldenkærne Cla~ (03-05-2002)
| Kommentar Fra : Jens Gyldenkærne Cla~ |
Dato : 03-05-02 22:58 |
|
"Thomas Schulz" <dk_sz@hotmail.com> skrev:
> Yep, men som der står, så er 2 af dem (dem der er multi-table)
> 4.x syntax. AFAIK Viborgnet.dk (som er hvor jeg har mit
> website liggende hos) bruger vist 3.x serien
Surt show.
> Men der får jeg fejl:
> Error: 1109 - Unknown table 'accountstoactivate' in where
> clause
Er det ikke bare en versalfølsomhedsfejl (hedder din tabel f.eks.
AccountstoActivate el.lign?). Når fejlen alene går på tabelnavnet
tyder det på at syntaksen er o.k.
--
Jens Gyldenkærne Clausen
MF (Medlem af Fiduso - www.fiduso.dk)
| |
Thomas Schulz (04-05-2002)
| Kommentar Fra : Thomas Schulz |
Dato : 04-05-02 09:25 |
|
> Er det ikke bare en versalfølsomhedsfejl (hedder din tabel f.eks.
> AccountstoActivate el.lign?). Når fejlen alene går på tabelnavnet
nope - lowercase hele vejen igennem
Jeg fik en løsning i serverside.php gruppen hvor man splitter det op i 2
sqls, jeg tror jeg kan bruge det i stedet.
| |
-Martin- (03-05-2002)
| Kommentar Fra : -Martin- |
Dato : 03-05-02 18:17 |
|
On Thu, 2 May 2002 12:43:28 +0200, "Thomas Schulz" <dk_sz@hotmail.com>
wrote:
>Jeg har ikke været i stand til at finde et "Delete" eksempel der bare minde
>lidt om det jeg ønsker.
>Jeg bruger MySql 3.x serien (understøtter ikke cascading). Jeg vil helst
>have SQL skal være kompatibel med andre dbs.
>Den kode jeg har her virker ikke og er nok meget forkert, men den forklarer
>hvad jeg vil meget godt:
>
>
>DELETE FROM accountsall,accountstoactivate
>WHERE accountsall.AccountID = accountstoactivate.AccountID
>AND accountstoactivate.Stamp < DATE_SUB(NOW(), INTERVAL 48 HOUR)
SELECT *
FROM tabel
WHERE TO_DAYS(dato_felt) >
TO_DAYS(DATE_ADD(NOW(), INTERVAL 48 HOURS))")
Prøv at tjekke den?
Jeg sad også og rodede med DATE_SUB men fandt ud af at den virker på
en TEMMELIG mærkelig måde og dokumentationen ikk rigtig gælder for det
punkt, men DATE_ADD er bedre og virker :) ihvertfald i mit tilfælde
hvor jeg dog bruger DAYS istedet for HOURS!
Det med en dobbelt delete har jeg aldrig brugt, så det aner jeg ikk om
virker :)
| |
Thomas Schulz (03-05-2002)
| Kommentar Fra : Thomas Schulz |
Dato : 03-05-02 19:45 |
|
> SELECT *
> FROM tabel
> WHERE TO_DAYS(dato_felt) >
> TO_DAYS(DATE_ADD(NOW(), INTERVAL 48 HOURS))")
Men nu er sådan at jeg vil Delete - ikke Selecte... (eller misforstod jeg
din besked?)
Jeg har allerede en select der virker:
--
SELECT a.* FROM accountsall a, accountstoactivate b
WHERE a.AccountID = b.AccountID
AND b.Stamp > Now() - INTERVAL 48 HOUR
Thomas
| |
-Martin- (04-05-2002)
| Kommentar Fra : -Martin- |
Dato : 04-05-02 01:27 |
|
On Fri, 3 May 2002 20:45:15 +0200, "Thomas Schulz" <dk_sz@hotmail.com>
wrote:
>> SELECT *
>> FROM tabel
>> WHERE TO_DAYS(dato_felt) >
>> TO_DAYS(DATE_ADD(NOW(), INTERVAL 48 HOURS))")
>
>Men nu er sådan at jeg vil Delete - ikke Selecte... (eller misforstod jeg
>din besked?)
>
>Jeg har allerede en select der virker:
WHERE TO_DAYS(dato_felt) >
TO_DAYS(DATE_ADD(NOW(), INTERVAL 48 HOURS))")
SÅDAN ... så sæt dine andre klausuler ind ... ville bare vise en mulig
løsning på problemet med brug af DATE_ADD
| |
Thomas Schulz (04-05-2002)
| Kommentar Fra : Thomas Schulz |
Dato : 04-05-02 09:26 |
|
> SÅDAN ... så sæt dine andre klausuler ind ... ville bare vise en mulig
> løsning på problemet med brug af DATE_ADD
ok, mange tak.
Thomas
| |
|
|