Aller Daten von einer Tabelle löschen, was mein Select liefert

NordFrau

Grünschnabel
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
 
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:

SQL:
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:

SQL:
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 ;-)
 
Zuletzt bearbeitet:
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
 
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:

SQL:
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.
 
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
 
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:
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:
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:
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.
 
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
 
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?
 
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
 
Hallo, ich würde es persönlich so nicht lösen, aber gehen tut das:
Code:
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
 

Neue Beiträge

Zurück