tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
9
ZUGRIFFE
512
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    NordFrau NordFrau ist offline Grünschnabel
    Registriert seit
    Dec 2011
    Beiträge
    4
    Hallo,

    der Start in SQL ist ganz schön holprig

    Weiß jemand, wie ich Daten von einer Tabelle lösche, die mein Select liefert?

    Mein Select liefert in diesem Fall alle Schüler von der 7. und 8. Klasse, die schlechter als 3,0 stehen. Diese Schüler möchte ich von der Schultabelle löschen aber ich weiß nicht wie ;-(

    So müsste es lauten:

    DELETE * FROM schule
    WHERE (SELECT ... und hier kommt meine Select-Abfrage)

    Das funktioniert aber nicht ;-(
    Einen Primärschlüssel gibt es hier nicht, sonst hätte ich einfach "WHERE PK IN (...)" geschrieben - denn das funktioniert.

    Hilfe Hilfe Hilfe ))

    Viele Grüße
    Steffi

    PS: SQL Express 2008
     

  2. #2
    Avatar von saftmeister
    saftmeister saftmeister ist offline Der Saft sei mit dir
    tutorials.de Premium-User
    Registriert seit
    May 2006
    Ort
    There is no place like 127.0.0.1
    Beiträge
    3.521
    Ein SUBSELECT ist bei DELETE nicht notwendig, du kannst als WHERE-Klausel genau das gleiche angeben, was du auch beim SELECT angeben würdest.

    SUBSELECTs sind in den seltensten Fällen notwendig. Hier mal ein Beispiel für den DELETE anhand der Angaben eines SELECTS:

    Code sql:
    1
    
    SELECT * FROM tabelle WHERE spalte1 LIKE '%Hallo%' AND spalte2 = 123;

    Angenommen, dieser SELECT liefert dir 4 Datensätze, dann kannst du diese 4 Datensätze mit dem DELETE löschen:

    Code sql:
    1
    
    DELETE FROM tabelle WHERE spalte1 LIKE '%Hallo%' AND spalte2 = 123;

    Bin nur grad unsicher, ob man bei MSSQL ein COMMIT benötigt, um die Transaktion zu beenden oder ob da ein Auto-Commit standard ist.

    EDIT: Vergiss das mit dem Commit, wollte dich nicht noch mehr verwirren. Nur für die Zukunft, wenn das Thema akut wird, Transaktionen müssen - wie bei anderen RDBMS auch - mittels BEGIN eingeleitet werden. Aber das nur nebenbei. Transaktionen solltest du evtl. erstmal bei Seite legen
    Geändert von saftmeister (04.12.11 um 14:38 Uhr)
     
    Grüße
    --
    Qualität des Codes wird in WTF's/Min gemessen: Je mehr, desto schlechter der Code ;-)

  3. #3
    NordFrau NordFrau ist offline Grünschnabel
    Registriert seit
    Dec 2011
    Beiträge
    4
    Hallo,

    vielen lieben Dank für deine Antwort.

    Ich möchte unbedingt ein Subselect machen. Könntest du mir hierfür die Syntax nennen?

    Liebe Grüße
    Steffi
     

  4. #4
    Avatar von saftmeister
    saftmeister saftmeister ist offline Der Saft sei mit dir
    tutorials.de Premium-User
    Registriert seit
    May 2006
    Ort
    There is no place like 127.0.0.1
    Beiträge
    3.521
    Nunja, wie ich schon andeutete, macht das eigentlich keinen Sinn, es verlangsamt nur den Vorgang, vor allem, wenn du keine INDIZES dafür verwenden kannst (kein Primärschlüssel, etc.).

    Grundsätzlich wäre es aber so zu erledigen:

    Code sql:
    1
    
    DELETE FROM tabelle WHERE spalte1 IN (SELECT spalte1 FROM tabelle WHERE ....) AND spalte2 IN (SELECT spalte2 FROM tabelle WHERE ....);

    Das ist allerdings sehr langsam und problematisch wenn du eine weitere Spalte als Kondition der Where-Klausel hinzufügen willst. Warum willst du das unbedingt über Sub-Select machen?

    Davon ab, das es gegen die Best-Practices von RDBMS verstößt. Viel eleganter wäre in dem Fall, du würdst einfach eine zusätzliche Spalte "ID" als Primär-Schlüssel hinzufügen.
     
    Grüße
    --
    Qualität des Codes wird in WTF's/Min gemessen: Je mehr, desto schlechter der Code ;-)

  5. #5
    NordFrau NordFrau ist offline Grünschnabel
    Registriert seit
    Dec 2011
    Beiträge
    4
    Hallo,

    leider klappt das nicht, das habe ich auch schon versucht ;-(

    Fehlermeldung:
    Msg 4145, Level 15, State 1, Line 3
    An expression of non-boolean type specified in a context where a condition is expected, near ','.


    Mein Code:

    DELETE FROM schule
    WHERE lehrer, schueler, (usw)
    IN ( SELECT lehrer, schueler, (usw) FROM schule)

    Wenn ich nur "WHERE lehrer IN" schreibe, funktioniert es. Aber mit mehreren Spalten nicht ;-(

    Fehlt Frauen das technisches Verständnis für SQL oder warum halten mich immer solche Kleinigkeiten massenhaft auf?

    Liebe Grüße
    Steffi
     

  6. #6
    Avatar von saftmeister
    saftmeister saftmeister ist offline Der Saft sei mit dir
    tutorials.de Premium-User
    Registriert seit
    May 2006
    Ort
    There is no place like 127.0.0.1
    Beiträge
    3.521
    Also, du kannst bei einem SUBSELECT immer nur eine Spalte selektieren. Was da zurück kommt, ist eine Liste, die mindestens einen oder mehrere Datensätze enthält. Daher auch das IN (....). Bedeutet also ungefähr so viel wie (Pseudocode):

    Code :
    1
    
    LÖSCHE [datensätze] VON TABELLE BEI DENEN spalte ENTHÄLT (Hier kommt der Subselect, der aber nur eine Spalte selektieren darf);

    Wenn du jetzt mehrere Spalten prüfen willst, also mehrere Spalten in die WHERE-Klausel einfügen willst, musst du auch mehrere Sub-Selects machen (Pseudocode):

    Code :
    1
    
    LÖSCHE [datensätze] VON TABELLE BEI DENEN spalte1 ENTHÄLT (Hier kommt der Subselect, der aber nur eine Spalte selektieren darf) UND spalte2 ENTHÄLT (Hier kommt der zweite Subselect, der auch nur eine Spalte selektieren darf);


    Wie du vielleicht selbst bemerkst, ist dieses Vorgehen sehr unelegant. Daher geh doch lieber den Weg über einen "simplen" Delete mit einer einfachen WHERE-Klausel, in der alle Bedingungen drin stehen. Schließlich ist es doch viel einfacher zu sagen (Pseudocode):

    Code :
    1
    
    LÖSCHE [datensätze] VON TABELLE BEI DENEN spalte1 IST 'wert1' UND spalte2 IST 'wert2'

    PS: Das hat ganz sicher nichts mit dem Geschlecht zu tun Eher mit der Vorstellung, wie Sprache funktioniert Der letzte Ansatz ist einfach intuitiver und deswegen auch der, der am schnellsten zum Ziel führt. Evtl. bringt es dir was, wenn du das SQL in deine eigene Sprache übersetzt, du wirst merken, das geht sehr einfach und es kommt sehr oft genau das raus, was du eigentlich der Datenbank sagen willst.
     
    Grüße
    --
    Qualität des Codes wird in WTF's/Min gemessen: Je mehr, desto schlechter der Code ;-)

  7. #7
    NordFrau NordFrau ist offline Grünschnabel
    Registriert seit
    Dec 2011
    Beiträge
    4
    Hallo,

    vielen lieben Dank für deine Antwort.

    Gibt es noch weitere Alternativen zu diesem SQL-Code:

    DELETE FROM schule
    WHERE lehrer, schueler, (usw)
    IN ( SELECT lehrer, schueler, (usw) FROM schule)

    Wie du siehst, möchte ich unbedingt diesen 2. Select so belassen. Das muss doch irgendwie möglich sein - auch ohne die einzelnen Select-Befehle

    Ich glaube, ich stecke gerade in einer Sackgasse. Ich bin überzeugt, dass mein Vorhaben irgendwie möglich ist aber technisch gibt es wohl doch Einschränkungen ;-(

    Liebe Grüße
     

  8. #8
    Avatar von saftmeister
    saftmeister saftmeister ist offline Der Saft sei mit dir
    tutorials.de Premium-User
    Registriert seit
    May 2006
    Ort
    There is no place like 127.0.0.1
    Beiträge
    3.521
    Syntaktisch ist der Query nicht in Ordnung. SQL wurde nuneinmal so definiert, wie es sich verhält. Du sagst doch auch nicht, das ein Satz irgendwie korrekt sein muss, auch wenn das Prädikat fehlt

    Ich weiß, die Analogie scheint seltsam, aber genau so ist es. SQL ist eine Sprache und unterliegt daher gewissen Regeln. Man kann die Sprache erweitern, wenn sie es zu lässt. SQL lässt Erweiterungen in einem gewissen Rahmen zu. Möglicherweise kann man mit Stored Procedures ein Verhalten herbei führen, das dem ähnelt, was du machen willst.

    Ich nehme an, das du denkst, dass das funktionieren muss, weil es ja bei INSERT so funktioniert. Aber jeder Befehl hat nunmal seine Form und Ausdrucksweise. Die kann man nicht strecken oder umformen.

    Eine Alternative, wie du sie dir vorstellst, ist mir nicht bekannt und es macht ja auch keinen Sinn, das so zu machen, weil es eine klare definierte Vorgehensweise für dein Anliegen gibt. Die habe ich dir schon im ersten Posting von mir beschrieben. Aber ich lasse mich eines Besseren belehren, schließlich habe ich die Weisheit nicht mit Löffeln gefressen Jemand anders ne Idee?
     
    Grüße
    --
    Qualität des Codes wird in WTF's/Min gemessen: Je mehr, desto schlechter der Code ;-)

  9. #9
    Avatar von takidoso
    takidoso takidoso ist offline Mitglied Brillant
    Registriert seit
    Aug 2004
    Ort
    Kömigstein
    Beiträge
    911
    hi ho,
    ohne die syntax genau zu wissen, aber kann es sein, dass man vielleicht dden Inhalt der Spalten, die man sucht, koncatinieren könnte und auch das was man in der Subquerry ermittelt (die mehereen Spalten) zusammenklebt?

    mit vorweihnachtlichen Grüßen

    Takidoso
     

  10. #10
    Avatar von bn
    bn bn ist offline Mitglied Brokat
    Registriert seit
    Oct 2002
    Ort
    Berlin
    Beiträge
    395
    Hallo, ich würde es persönlich so nicht lösen, aber gehen tut das:
    Code :
    1
    2
    
    DELETE FROM schule
    WHERE (lehrer, schueler, (usw)) IN (SELECT lehrer, schueler, (usw) FROM schule)

    Die Spalten-Anzahl beider Tupel muss identisch sein. Ich empfehle dir für diesen simplen Kram jedoch eine normale WHERE Bedingung ohne Subselect. Warum machst du es dir komplizierter als es ist? Frauen?

    Grüße BN
     
    Eine Lösung hätte ich schon, aber sie passt nicht zum Problem.

Ähnliche Themen

  1. Antworten: 0
    Letzter Beitrag: 05.01.11, 09:05
  2. Select liefert plötzlich keine Daten
    Von painky im Forum .NET Datenverwaltung
    Antworten: 2
    Letzter Beitrag: 10.12.08, 15:25
  3. Antworten: 2
    Letzter Beitrag: 20.01.08, 14:38
  4. Anzahl aller Einträge einer SQL Tabelle trotz LIMIT
    Von dobermant im Forum Relationale Datenbanksysteme
    Antworten: 12
    Letzter Beitrag: 11.05.07, 12:18
  5. Inhalt aller Felder einer Spalte aus einer Tabelle rauslesen
    Von messmar im Forum Relationale Datenbanksysteme
    Antworten: 3
    Letzter Beitrag: 12.01.05, 15:17