Ich versuche eine Abfrage wie folgt durchzuführen:
DELETE FROM term_hierarchy AS th
WHERE th.parent = 1015 AND th.tid IN (
SELECT DISTINCT(th1.tid)
FROM term_hierarchy AS th1
INNER JOIN term_hierarchy AS th2 ON (th1.tid = th2.tid AND th2.parent != 1015)
WHERE th1.parent = 1015
);
Wie Sie wahrscheinlich sehen können, möchte ich die Elternbeziehung zu 1015 löschen, wenn dieselbe Nachricht andere Eltern hat. Dies führt jedoch zu einem Syntaxfehler:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'AS th
WHERE th.parent = 1015 AND th.tid IN (
SELECT DISTINCT(th1.tid)
FROM ter' at line 1
Ich habe die Dokumentation überprüft und die Unterabfrage selbst ausgeführt, und alles scheint zu überprüfen. Kann jemand herausfinden, was hier falsch ist?
Update : Wie unten beantwortet, erlaubt MySQL nicht, dass die Tabelle, aus der Sie löschen, in einer Unterabfrage für die Bedingung verwendet wird.
DELETE t FROM table t ...
Antworten:
Sie können keine Zieltabelle zum Löschen angeben.
Eine Problemumgehung
quelle
Für andere, die diese Frage während der Verwendung einer Unterabfrage löschen möchten, überlasse ich Ihnen dieses Beispiel, um MySQL zu überlisten (auch wenn einige Leute glauben, dass dies nicht möglich ist):
gibt Ihnen einen Fehler:
Allerdings diese Abfrage:
wird gut funktionieren:
Schließen Sie Ihre Unterabfrage in eine zusätzliche Unterabfrage (hier mit dem Namen x) ein, und MySQL erledigt gerne das, was Sie verlangen.
quelle
e
) in einem DELETE und in seinem Sub-SELECT verwenden. Wir können jedoch ein Sub-Sub-SELECT verwenden, um eine temporäre Tabelle (x
) zu erstellen , und dieses für das Sub-SELECT verwenden.Der Alias sollte nach dem
DELETE
Schlüsselwort stehen:quelle
Sie müssen in der delete-Anweisung erneut auf den Alias verweisen, z.
Wie hier in MySQL-Dokumenten beschrieben.
quelle
delete from your_table as t1 where t1.id in(select t2.id from your_table t2);
das einfach, was hast du bekommen?Currently, you cannot delete from a table and select from the same table in a subquery.
dev.mysql.com/doc/refman/5.5/en/delete.htmlIch ging das etwas anders an und es funktionierte für mich;
Ich musste
secure_links
aus meiner Tabelle entfernen , die auf dieconditions
Tabelle verwies, in der keine Bedingungszeilen mehr vorhanden waren. Im Grunde genommen ein Housekeeping-Skript. Dies gab mir den Fehler - Sie können keine Zieltabelle zum Löschen angeben.Als ich hier nach Inspiration suchte, kam ich auf die folgende Abfrage und sie funktioniert einwandfrei. Dies liegt daran, dass eine temporäre Tabelle erstellt
sl1
wird, die als Referenz für DELETE verwendet wird.Funktioniert bei mir.
quelle
Ist die "in" -Klausel in der Löschung nicht ... äußerst ineffizient, wenn eine große Anzahl von Werten von der Unterabfrage zurückgegeben wird? Sie sind sich nicht sicher, warum Sie nicht einfach eine innere (oder rechte) Verknüpfung mit der ursprünglichen Tabelle aus der zu löschenden Unterabfrage auf der ID herstellen möchten, anstatt uns die "in (Unterabfrage)".?
Und vielleicht wird es in "MySQL erlaubt es nicht" beantwortet, aber es funktioniert gut für mich, vorausgesetzt, ich stelle sicher, dass ich vollständig kläre, was gelöscht werden soll (T AUS Ziel AS T LÖSCHEN). Löschen mit Join in MySQL verdeutlicht das Problem DELETE / JOIN.
quelle
Wenn Sie dies mit 2 Abfragen tun möchten, können Sie immer etwas Ähnliches tun:
1) Nehmen Sie die IDs vom Tisch mit:
Kopieren Sie dann das Ergebnis mit Maus / Tastatur oder Programmiersprache nach XXX:
Vielleicht könnten Sie dies in einer Abfrage tun, aber das ist, was ich bevorzuge.
quelle
@CodeReaper, @BennyHill: Es funktioniert wie erwartet.
Ich frage mich jedoch, wie zeitaufwändig es ist, Millionen von Zeilen in der Tabelle zu haben. Anscheinend dauerte
5ms
die Ausführung ungefähr 5k Datensätze in einer korrekt indizierten Tabelle.Meine Frage:
quelle
Sie können den Alias auf diese Weise für die delete-Anweisung verwenden
quelle