T-SQL: selezione delle righe da eliminare tramite join

Scenario:

Diciamo che ho due tabelle, TableA e TableB. La chiave primaria di TableB è una singola colonna (BId) ed è una colonna chiave esterna in TableA.

Nella mia situazione, voglio rimuovere tutte le righe in TableA che sono collegate con righe specifiche in TableB: Posso farlo attraverso i join? Elimina tutte le righe che sono state estratte dai join?

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

O sono costretto a fare questo:

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

Il motivo per cui lo chiedo è che mi sembra che la prima opzione sarebbe molto più efficace quando si tratta di tabelle più grandi.

Grazie!

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

dovrebbe funzionare

Vorrei usare questa syntax

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

Si, puoi. Esempio :

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

Stavo cercando di farlo con un database di accesso e ho scoperto che avevo bisogno di usare a. * Subito dopo l’eliminazione.

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

È quasi la stessa cosa in MySQL , ma devi usare l’ alias della tabella subito dopo la parola “DELETE”:

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

La syntax sopra non funziona in Interbase 2007. Invece, dovevo usare qualcosa come:

 DELETE FROM TableA a WHERE [filter condition on TableA] AND (a.BId IN (SELECT a.BId FROM TableB b JOIN TableA a ON a.BId = b.BId WHERE [filter condition on TableB])) 

(Nota Interbase non supporta la parola chiave AS per gli alias)

Sto usando questo

 DELETE TableA FROM TableA a INNER JOIN TableB b on b.Bid = a.Bid AND [condition] 

e @TheTXI è abbastanza buono, ma leggo risposte e commenti e ho trovato che una cosa deve essere risolta sta usando la condizione nella clausola WHERE o come condizione di join. Così ho deciso di testarlo e scrivere uno snippet ma non ho trovato una differenza significativa tra loro. Puoi vedere lo script sql qui e il punto importante è che ho preferito scriverlo come commnet perché non è la risposta esatta ma è grande e non può essere inserito nei commenti, ti prego scusami.

 Declare @TableA Table ( aId INT, aName VARCHAR(50), bId INT ) Declare @TableB Table ( bId INT, bName VARCHAR(50) ) Declare @TableC Table ( cId INT, cName VARCHAR(50), dId INT ) Declare @TableD Table ( dId INT, dName VARCHAR(50) ) DECLARE @StartTime DATETIME; SELECT @startTime = GETDATE(); DECLARE @i INT; SET @i = 1; WHILE @i < 1000000 BEGIN INSERT INTO @TableB VALUES(@i, 'nameB:' + CONVERT(VARCHAR, @i)) INSERT INTO @TableA VALUES(@i+5, 'nameA:' + CONVERT(VARCHAR, @i+5), @i) SET @i = @i + 1; END SELECT @startTime = GETDATE() DELETE a --SELECT * FROM @TableA a Inner Join @TableB b ON a.BId = b.BId WHERE a.aName LIKE '%5' SELECT Duration = DATEDIFF(ms,@StartTime,GETDATE()) SET @i = 1; WHILE @i < 1000000 BEGIN INSERT INTO @TableD VALUES(@i, 'nameB:' + CONVERT(VARCHAR, @i)) INSERT INTO @TableC VALUES(@i+5, 'nameA:' + CONVERT(VARCHAR, @i+5), @i) SET @i = @i + 1; END SELECT @startTime = GETDATE() DELETE c --SELECT * FROM @TableC c Inner Join @TableD d ON c.DId = d.DId AND c.cName LIKE '%5' SELECT Duration = DATEDIFF(ms,@StartTime,GETDATE()) 

Se potresti ottenere una buona ragione da questo script o scrivere un altro utile, per favore condividi. Grazie e spero questo aiuto.

Diciamo che hai 2 tabelle, una con un set Master (ad esempio Dipendenti) e una con un set figlio (ad esempio i Dipendenti) e vuoi eliminare tutte le righe di dati nella tabella Dipendenti che non possono digitare con qualsiasi riga nella tabella Master.

 delete from Dependents where EmpID in ( select d.EmpID from Employees e right join Dependents d on e.EmpID = d.EmpID where e.EmpID is null) 

Il punto da notare qui è che stai raccogliendo un ‘array’ di EmpID dal join prima, usando quel set di EmpID per fare un’operazione di cancellazione sulla tabella Dipendenti.

In SQLite, l’unica cosa che funziona è qualcosa di simile alla risposta di beauXjames.

Sembra scendere a questo DELETE FROM table1 WHERE table1.col1 IN (SOME TEMPORARY TABLE); e che alcune tabelle temporanee possono essere create da SELECT e JOIN nelle due tabelle in cui è ansible filtrare questa tabella temporanea in base alla condizione in cui si desidera eliminare i record in Table1.

puoi eseguire questa query: –

 Delete from TableA from TableA a, TableB b where a.Bid=b.Bid AND [my filter condition] 

Il modo più semplice è:

 DELETE TableA FROM TableB WHERE TableA.ID = TableB.ID