Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

delete top 10 from...funktioniert nicht.

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von Michi_R, 7 Januar 2014.

  1. Michi_R

    Michi_R Fleissiger Benutzer

    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
     
  2. akretschmer

    akretschmer Datenbank-Guru

    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.
     
  3. Michi_R

    Michi_R Fleissiger Benutzer

    Oh no, ich bin in MSSQL...wann werde ich mich jemals daran gewöhnen.
    Tabelle hat keinen pk!
     
  4. Michi_R

    Michi_R Fleissiger Benutzer

    bzw pk ist nur über jahr und kw zusammen möglich, hab ich aber bisher nicht definiert.
     
  5. akretschmer

    akretschmer Datenbank-Guru

    dann delete from ... where (jahr, kw) = (select top 10 jahr, kw from ...)
     
  6. Michi_R

    Michi_R Fleissiger Benutzer

    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'.
     
  7. akretschmer

    akretschmer Datenbank-Guru

    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
     
  8. Michi_R

    Michi_R Fleissiger Benutzer

    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?
     
  9. akretschmer

    akretschmer Datenbank-Guru

    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.
     
  10. ukulele

    ukulele Datenbank-Guru

    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.
     
    Michi_R gefällt das.
  11. akretschmer

    akretschmer Datenbank-Guru

    Ah ja, ich vergaß....
     
    Michi_R gefällt das.
  12. Michi_R

    Michi_R Fleissiger Benutzer

    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.
     
  13. akretschmer

    akretschmer Datenbank-Guru

    Ich denk mal, im inneren select müßte man das a * 10000 + b dann auch machen ...
     
    Michi_R gefällt das.
  14. Michi_R

    Michi_R Fleissiger Benutzer

    Jahaaaa, funktioniert.
    Dankeschön!
     
  15. ukulele

    ukulele Datenbank-Guru

    Ups, natürlich.
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden