2017-10-21 4 views
2

Wenn ich die Vorlesungen des Datenbanksystems studiere, habe ich versucht, den Code in den Vorlesungsfolien zur Verfügung gestellt, aber hat nicht funktioniert. Das Beispiel besteht darin, einige Tupel aus einer Tabelle zu löschen.Löschen mehrerer Zeilen aus einer Tabelle (SQL)

Beispiel: Löschen von Bier (name, manf) alle Biere, für die es ein anderes Bier vom gleichen Hersteller gibt. Und der Code in der Folie vorgesehen ist wie folgt:

DELETE FROM Beers b 
WHERE EXISTS( 
    SELECT name 
    FROM Beers 
    WHERE manf = b.manf AND name <> b.name); 

ich die Beers Tabelle zu erstellen und zwei Zeilen einfügen wie folgt:

create table Beers(
    name CHAR(30) primary key, 
    manf CHAR(30) 
); 

insert into Beers(name, manf) 
values('Bud', 'A-B'); 

insert into Beers 
values('Bud-lite', 'A-B'); 

und den Code testen. Laut der Vorlesung sollte es alle Tupel in Beers löschen, aber der Code funktioniert nicht und zeigt weiterhin "Sie können die Zieltabelle 'Beers' für die Aktualisierung in der FROM-Klausel nicht angeben, wenn ich die Löschoperation für SQL ausführe

kann mir jemand sagen, was mit dem Code falsch Dank

Add note:.?! Nur MySQL erfahren Sie können nicht den vorherigen Code ausführen kann aber dieses laufen:

Delete from Beers 
where exists(
    select a.name from(select b.name from Beers b 
        where manf = b.manf AND name!= b.name) as a); 

aber Ich weiß immer noch nicht, warum wir Select zweimal innerhalb von Existieren verwenden müssen. Könnte jemand erklären, wie dieser Code funktioniert?

+0

Mögliche Duplikat [Löschen - Ich kann nicht Ziel angeben Tabelle?] (https://stackoverflow.com/questions/5816840/delete-i-cant-specify-target-table) – Parfait

Antwort

2

In mysql während update/delete Sie nicht die gleiche Tabelle verwenden können, Alternativ können Sie das gleiche tun mit JOIN

DELETE a 
FROM Beers a 
JOIN Beers b ON a.manf = b.manf 
AND a.name <> b.name 
/* WHERE a.manf = 'A-B' is not necessary */ 

DEMO

+0

Also müssen wir DELETE a FROM Biere ein Join Beers b verwenden? Können wir hier nur DELETE FROM verwenden? Ich bin immer noch verwirrt, wenn wir DELETE FROM verwenden sollten und wenn 'DELETE A FROM ...' – tsen0406

+0

10 Sie sagen nur die Abfrage aus welcher Tabelle, um einen Datensatz wie 'löschen ein aus Tabelle a' zu löschen, wobei a ein Alias ​​für Tabelle ist –

+0

Danke! Dein Code funktioniert! Aber gibt es aus Neugierde irgendeine Methode, um den ursprünglichen Code zu reparieren, den der Dozent anbietet? Mit WHERE EXISTS? – tsen0406

Verwandte Themen