Question T-SQL: Sélection des lignes à supprimer via les jointures


Scénario:

Disons que j'ai deux tables, TableA et TableB. La clé primaire de TableB est une seule colonne (BId) et une colonne de clé étrangère dans TableA.

Dans ma situation, je veux supprimer toutes les lignes de la TableA qui sont liées à des lignes spécifiques dans la TableB: Puis-je le faire par des jointures? Supprimer toutes les lignes extraites des jointures?

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

Ou suis-je obligé de faire ceci:

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

La raison pour laquelle je pose la question est qu’il me semble que la première option serait beaucoup plus efficace pour traiter des tables plus grandes.

Merci!


454
2018-01-13 16:45


origine


Réponses:


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

devrait marcher


670
2018-01-13 16:50



J'utiliserais cette syntaxe

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

238
2018-01-13 16:51



Oui, vous pouvez. Exemple :

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

27
2018-01-13 16:50



J'essayais de faire cela avec une base de données d'accès et j'ai trouvé que je devais utiliser une.* juste après la suppression.

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

10
2017-07-22 12:55



C'est presque pareil en MySQL, mais vous devez utiliser le alias de table juste après le mot "SUPPRIMER":

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

8
2017-08-02 14:58



La syntaxe ci-dessus ne fonctionne pas dans Interbase 2007. Au lieu de cela, j'ai dû utiliser quelque chose comme:

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]))

(Remarque Interbase ne prend pas en charge le mot-clé AS pour les alias)


2
2017-11-19 19:14



Supposons que vous ayez 2 tables, une avec un ensemble maître (par exemple, employés) et une avec un ensemble enfant (par exemple dépendants) et que vous souhaitiez supprimer toutes les lignes de données de la table Personnes à charge qui ne peuvent pas entrer avec toutes les lignes de la table principale.

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)

Le point à noter ici est que vous collectez simplement un 'tableau' d'EmpIDs à ​​partir de la jointure en premier, en utilisant cet ensemble d'EmpIDs pour effectuer une opération de suppression sur la table Dependents.


1
2018-06-13 18:36



Dans SQLite, la seule chose qui fonctionne est quelque chose de similaire à la réponse de beauXjames.

Il semble que cela se résume à cela      DELETE FROM table1 WHERE table1.col1 IN (SOME TEMPORARY TABLE); et que certaines tables temporaires peuvent être mises en caisse par SELECT et JOIN votre table deux que vous pouvez filtrer cette table temporaire basée sur la condition que vous voulez supprimer les enregistrements dans Table1.


1
2017-07-20 17:31