Szenario:
Angenommen, ich habe zwei Tabellen, Tabelle A und Tabelle B. Der Primärschlüssel von Tabelle B ist eine einzelne Spalte (BId) und eine Fremdschlüsselspalte in Tabelle A.
In meiner Situation möchte ich alle Zeilen in Tabelle A entfernen, die mit bestimmten Zeilen in Tabelle B verknüpft sind: Kann ich dies über Verknüpfungen tun? Alle Zeilen löschen, die aus den Joins gezogen werden?
DELETE FROM TableA
FROM
TableA a
INNER JOIN TableB b
ON b.BId = a.BId
AND [my filter condition]
Oder bin ich dazu gezwungen:
DELETE FROM TableA
WHERE
BId IN (SELECT BId FROM TableB WHERE [my filter condition])
Der Grund, den ich frage, scheint mir, dass die erste Option beim Umgang mit größeren Tabellen viel effizienter wäre.
Vielen Dank!
DELETE TableA, TableB ...
und dabei die relevanten Datensätze aus beiden gelöscht. Nett.DELETE from TableA a using TableB b where b.Bid = a.Bid and [my filter condition]
DELETE a FROM TableA a INNER JOIN TableB b on b.Bid = a.Bid and [my filter condition]
Ich würde diese Syntax verwenden
quelle
Ja, du kannst. Beispiel:
quelle
Ich habe versucht, dies mit einer Zugriffsdatenbank zu tun, und festgestellt, dass ich direkt nach dem Löschen ein. * Verwenden muss .
quelle
In MySQL ist es fast dasselbe , aber Sie müssen den Tabellenalias direkt nach dem Wort "DELETE" verwenden:
quelle
Die obige Syntax funktioniert in Interbase 2007 nicht. Stattdessen musste ich Folgendes verwenden:
(Hinweis Interbase unterstützt das AS-Schlüsselwort für Aliase nicht.)
quelle
Ich benutze das
und @TheTXI Weg ist so gut wie genug, aber ich habe Antworten und Kommentare gelesen und festgestellt, dass eine Sache, die beantwortet werden muss, die Verwendung der Bedingung in der WHERE-Klausel oder als Join-Bedingung ist. Also beschloss ich, es zu testen und ein Snippet zu schreiben, fand aber keinen bedeutenden Unterschied zwischen ihnen. Sie können SQL-Skript hier sehen und wichtiger Punkt ist, dass ich es vorgezogen habe, es als Commnet zu schreiben, da dies keine genaue Antwort ist, aber es ist groß und kann nicht in Kommentare eingefügt werden, bitte entschuldigen Sie mich.
Wenn Sie einen guten Grund für dieses Skript haben oder ein anderes nützliches schreiben könnten, teilen Sie es uns bitte mit. Danke und hoffe diese Hilfe.
quelle
Angenommen, Sie haben zwei Tabellen, eine mit einem Master-Satz (z. B. Mitarbeiter) und eine mit einem untergeordneten Satz (z. B. Abhängige), und Sie möchten alle Datenzeilen in der Tabelle Abhängige entfernen, die nicht verschlüsselt werden können mit beliebigen Zeilen in der Master-Tabelle.
Der Punkt, der hier zu beachten ist, ist, dass Sie nur ein 'Array' von EmpIDs aus dem Join zuerst sammeln und diesen Satz von EmpIDs verwenden, um einen Löschvorgang für die Tabelle Dependents durchzuführen.
quelle
In SQLite funktioniert nur etwas, das der Antwort von beauXjames ähnelt.
Es scheint darauf zurückzuführen zu sein,
DELETE FROM table1 WHERE table1.col1 IN (SOME TEMPORARY TABLE);
dass eine temporäre Tabelle durch SELECT und JOIN your two table erstellt werden kann. Sie können diese temporäre Tabelle basierend auf der Bedingung filtern, dass Sie die Datensätze in Tabelle 1 löschen möchten.quelle
Sie können diese Abfrage ausführen: -
quelle
Der einfachere Weg ist:
quelle
Minimieren Sie die Verwendung von DML-Abfragen mit Joins. Sie sollten in der Lage sein, die meisten DML-Abfragen mit Unterabfragen wie oben durchzuführen.
Im Allgemeinen sollten Verknüpfungen nur verwendet werden, wenn Sie nach Spalten in 2 oder mehr Tabellen SELECT oder GROUP benötigen. Wenn Sie nur mehrere Tabellen berühren, um eine Grundgesamtheit zu definieren, verwenden Sie Unterabfragen. Verwenden Sie für DELETE-Abfragen eine korrelierte Unterabfrage.
quelle