ERLEDIGT
NEIN
NEIN
ANTWORTEN
9
9
ZUGRIFFE
512
512
EMPFEHLEN
-
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
-
04.12.11 14:31 #2
- 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 ;-)
-
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
-
04.12.11 15:09 #4
- 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 ;-)
-
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
-
04.12.11 20:21 #6
- 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 ;-)
-
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
-
04.12.11 23:24 #8
- 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 ;-)
-
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 :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 BNEine Lösung hätte ich schon, aber sie passt nicht zum Problem.
Ähnliche Themen
-
Access 2010 / VBA: Daten einer Tabelle mit Daten anderer Tabelle überschreiben
Von grotten im Forum Office-AnwendungenAntworten: 0Letzter Beitrag: 05.01.11, 09:05 -
Select liefert plötzlich keine Daten
Von painky im Forum .NET DatenverwaltungAntworten: 2Letzter Beitrag: 10.12.08, 15:25 -
Ausgabe aller Abfrageergebnisse einer DB-Tabelle
Von WIK-Lars im Forum PHPAntworten: 2Letzter Beitrag: 20.01.08, 14:38 -
Anzahl aller Einträge einer SQL Tabelle trotz LIMIT
Von dobermant im Forum Relationale DatenbanksystemeAntworten: 12Letzter Beitrag: 11.05.07, 12:18 -
Inhalt aller Felder einer Spalte aus einer Tabelle rauslesen
Von messmar im Forum Relationale DatenbanksystemeAntworten: 3Letzter Beitrag: 12.01.05, 15:17





Zitieren

Login





