SQL Delete

  • hey ich hab mal ne frage zu SQL
    meine Datenbank sieht in etwa so aus:

    Name | Info | Art | ID |

    Klaus | 4 | 3 | 34 |
    Klaus | 4 | 3 | 34 |
    Peter | 3 | 3 | 23 |
    Bernd | 4 | 2 | 34 |

    ok so jetz möchte ich einen Datensatz aus dieser Tabelle löschen...ich hab das jetzt folgendermaßen gemacht:

    Delete From Tabelle1 Where Name = "Klaus" And Info = "4" And Art = "3" AND ID = "34";

    jetz würde ich wie in dem SQL-Befehl zu sehen ist den Datensatz mit klaus löschen, allerdings löscht er mir immer alle von Klaus weg, ich möchte aber nur dass ein Eintrag gelöscht wird...


    In meiner Datenbank kommen häufig Datensätze doppelt vor und ich möchte aber dass immer nur einer gelöscht wird....einen Primärschlüssel nutze ich nicht, das wäre jetzt auch viel zu aufwendig den mit zu integrieren...
    ich hoffe es kennt jemand eine Lösung....bitte helft mir

    Einmal editiert, zuletzt von Reaker (8. März 2010 um 14:06)

  • meinst du so: ?

    Delete From Tabelle1 Where Name = "Klaus" And Info = "4" And Art = "3" AND ID = "34" Limit 1;

    weil bei mir gehts net richtig

  • Hachja, geht nicht richtig .... :). Wenn deine Abfrage vorher funktioniert hat, dann müsste sie es jetzt auch tun. Das Limit 1 sorgt nur dafür das nach dem ersten Fund gestoppt wird.

    SQL
    DELETE FROM Tabelle1 WHERE Name='Klaus' AND Info=4 AND Art=3 AND ID=34 LIMIT 1
  • wenn ich des limit weglasse dann löscht er alles, aber mit Limit kommt ein Syntax error...

    ich nutze übrigens die SQL funktionen von autoit

    • Offizieller Beitrag

    Ungetestet, Gedanke zur Lösung:
    Wenn du keinen Primärschlüssel vergibst, so wird jeder Datensatz ohne dein Zutun mit einer ID gespeichert. Diese kannst du unter "ROWID", "OID", oderr "_ROWID_" abfragen.
    Der Primärschlüssel ist nur ein Sonderfall dieser ID und wird als Alias für diese abgespeichert.
    - Abfrage auf Anzahl Doppel

    SQL
    SELECT count(OID) FROM MyTable WHERE BEDINGUNG;


    - wenn Anzahl größer 1:

    SQL
    DELETE FROM MyTable WHERE (
        OID in (SELECT OID FROM MyTable WHERE BEDINGUNG) and 
        OID > min (SELECT OID FROM MyTable WHERE BEDINGUNG)
        );
  • falls das von bugfix nicht funktioniert und LIMIT auch nicht, mach am besten noch eine spalte namens auto_increment oder so, welches jedesmal um 1 erhöht wird
    ich kenn mich mit mysql in autoit nicht aus (nur in php)
    und dass limit nicht funktioniert ist ja richtig doof...
    und eine auto_increment-funktion sollte es vielleicht mal automatisiert geben (also ein counter was bei jedem insert den zähler erhöht)
    gibts zumindest wie gesagt in php

    • Offizieller Beitrag

    Hab noch 'ne Variante mit GROUP, sollte definitiv funktionieren:

    SQL
    DELETE FROM MyTable
    Where [OID] NOT IN
    	( SELECT MIN ( X.[OID])
    		FROM MyTable As X
    		GROUP BY X.Name, X.Info, X.Art, X.ID
    	);

    Edit:
    Vorteil dieser Variante: Es wird von allen Mehrfach-Datensätzen nur einer behalten ohne dass du für jeden Inhalt eine extra WHERE-Klausel definieren mußt.

  • Hi was nutzt du den MSSQL oder MySQL?

    Ich gehe mal von MSSQL aus.

    Lasse dir doch deine Auswahl ersmal mit dem Select befehl anzeigen.

    Spoiler anzeigen
    SQL
    SELECT * FROM `Tabelle1` WHERE `Name` = 'Klaus' AND `Info` = '4' AND `Art` = '3'  AND `ID` = '34'

    Sonst müsste aber

    Spoiler anzeigen
    SQL
    DELETE FROM `Tabelle1` WHERE `Name` = 'Klaus' AND `Info` = '4' AND `Art` = '3'  AND `ID` = '34' LIMIT 1;


    eigentlich funktionieren.

    MfG
    Der_Doc

  • hey..ich nutzte halt die SQL funktionen von autoit....

    danke für eure bemühungen, aber ich habs jetzt anders gelöst...eigentlich recht simpel...

    also ich hab herausgefundne dass es in jeder tabelle eine spalte gibt die rowid heißt...die wird jedes mal bei nem eintrag erhöht...
    also hab ich mir über _Sqlite_gettable2d und ein paar bedingungen alle einträge geben lassen die gleich sind....nun ja über random wird dann einfach eine rowid rausgesucht von diesen doppelten einträgen und dieser gelöscht....

  • das meinte ich doch mit auto_increment in meinem post...
    das gibts auch in php und ohne sowas wärs richtig scheiße, müsste man ein eigenes machen