538 Stimmen

T-SQL: Auswählen von zu löschenden Zeilen über Joins

Szenario:

Nehmen wir an, ich habe zwei Tabellen, TabelleA und TabelleB. Der Primärschlüssel von TabelleB ist eine einzelne Spalte (BId) und ist eine Fremdschlüsselspalte in TabelleA.

In meiner Situation möchte ich alle Zeilen in TabelleA entfernen, die mit bestimmten Zeilen in TabelleB verknüpft sind: Kann ich das durch Joins erreichen? 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 gezwungen, dies zu tun:

DELETE FROM TableA
WHERE
   BId IN (SELECT BId FROM TableB WHERE [my filter condition])

Der Grund für meine Frage ist, dass mir die erste Option bei größeren Tabellen viel effizienter zu sein scheint.

Gracias.

795voto

TheTXI Punkte 36691
DELETE TableA
FROM   TableA a
       INNER JOIN TableB b
               ON b.Bid = a.Bid
                  AND [my filter condition] 

sollte funktionieren

281voto

cmsjr Punkte 52971

Ich würde folgende Syntax verwenden

Delete a 
from TableA a
Inner Join TableB b
on  a.BId = b.BId
WHERE [filter condition]

31voto

Diadistis Punkte 11787

Ja, das können Sie. Beispiel:

DELETE TableA 
FROM TableA AS a
INNER JOIN TableB AS b
ON a.BId = b.BId
WHERE [filter condition]

11voto

Tony Emrud Punkte 311

Ich habe versucht, dies mit einer Access-Datenbank zu tun und musste feststellen, dass ich a.* direkt nach dem Löschen.

DELETE a.*
FROM TableA AS a
INNER JOIN TableB AS b
ON a.BId = b.BId
WHERE [filter condition]

9voto

Michael Butler Punkte 5751

Es ist fast dasselbe in MySQL aber Sie müssen die Tabellenalias direkt nach dem Wort "LÖSCHEN":

DELETE a
FROM TableA AS a
INNER JOIN TableB AS b
ON a.BId = b.BId
WHERE [filter condition]

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X