delete top 10 from...funktioniert nicht.

Michi_R

Fleissiger Benutzer
Beiträge
81
Hallo und ein frohes neues Jahr!

Ich habe eine Tabelle mit 100 Zeilen, u.a. die Spalten Jahr und KW.
Ich möchte die 10 neuesten löschen.

select top 10 * from (select * from table) as x1 order by jahr desc, kw desc

=> Das funktioniert. Zum löschen ändere ich select in delete:

delete top 10 * from (select * from table) as x1 order by jahr desc, kw desc

Das geht aber leider nicht. Was muss ich ändern?
Das order by brauche ich weil die Einträge nicht sortiert sind.

Gruß,
Michi
 
Werbung:
select top 10 * from (select * from table) as x1 order by jahr desc, kw desc

=> Das funktioniert. Zum löschen ändere ich select in delete:

delete top 10 * from (select * from table) as x1 order by jahr desc, kw desc

Das geht aber leider nicht. Was muss ich ändern?
Das order by brauche ich weil die Einträge nicht sortiert sind.

Gruß,
Michi

Bist Du sicher, unter MySQL zu arbeiten?

Delete hat 'ne einfache Syntax: delete from ... where. Packe also in das WHERE Deine Regel rein, was zu löschen ist. Vermutlich hat Du einen PK in Deiner Tabelle, mache als im where ein pk = (select top 10 pk from ... order by ...). Ungetestet, da kein Oraggle verfügbar.
 
Code:
delete from table1 where (jahr, kw)=(select top 10 jahr, kw from table1 order by jahr desc, kw desc)
funktioniert leider, zumindest in mssql, nicht.

MS SQL Server Management Studio sagt


An expression of non-boolean type specified in a context where a condition is expected, near ','.
Incorrect syntax near the keyword 'order'.
 
An expression of non-boolean type specified in a context where a condition is expected, near ','.
Incorrect syntax near the keyword 'order'.

Kann auch ned gehen, war falsch ;-)


Code:
test=*# create table michi (a int, b int);
CREATE TABLE
test=*# delete from michi where (a,b) in (select a,b from michi);
DELETE 0

Andreas
 
mh, sry mit der Syntax kann ich nichts anfangen.
Soll ich das so übernehmen und a,b durch jahr und kw und michi durch table1 ersetzen?
 
mh, sry mit der Syntax kann ich nichts anfangen.
Soll ich das so übernehmen und a,b durch jahr und kw und michi durch table1 ersetzen?

Ja, im Prinzip. Teste aber erst, was das select liefert, und baue da auch Dein eigentliches select ein, sonst wäre es ineffizient und ein drop table besser ;-). Also, Du brauchst ein select, was dir (jahr,kw) liefert für die Rows, die zu löschen sind.
 
Ne MSSQL kriegt das mit (a,b) IN (... nicht hin weil er immer nur einzelne Werte vergleicht. Da es keinen einheitlichen pk gibt muss man da etwas frikeln. Wenn z.B. a und b zusammen einen pk bilden und beide ein INT irgendwo zwischen 0 und 9999 halten könnte man es so machen:
Code:
DELETE
FROM    michi
WHERE    a * 10000 + b IN (    SELECT    TOP 10
                                    a,
                                    b
                            FROM    michi
                            ORDER BY c )

PS: Natürlich gibt es noch gefüht 1000 andere Wege. In jedem Fall gehört in den eigentlichen DELETE nie ein TOP oder ORDER BY sondern alles muss in den WHERE Teil.
 
Das klingt sehr geil, jedoch hat Managament Studio immer noch was dagegen

Only one expression can be specified in the select list when the subquery is not introduced with EXISTS.
 
Werbung:
Zurück
Oben