Scénario:
Disons que j'ai deux tables, TableA et TableB. La clé primaire de TableB est une colonne unique (BId) et est une colonne de clé étrangère dans TableA.
Dans ma situation, je souhaite supprimer toutes les lignes du tableau A qui sont liées à des lignes spécifiques du tableau B: puis-je le faire via 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 lorsqu'il s'agit de tables plus grandes.
Merci!
DELETE TableA, TableB ...
et cela a en fait supprimé les enregistrements pertinents des deux. Agréable.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]
J'utiliserais cette syntaxe
la source
Oui, vous pouvez. Exemple :
la source
J'essayais de le faire avec une base de données d'accès et j'ai constaté que je devais utiliser un. * Juste après la suppression.
la source
C'est presque la même chose dans MySQL , mais vous devez utiliser l' alias de table juste après le mot "DELETE":
la source
La syntaxe ci-dessus ne fonctionne pas dans Interbase 2007. Au lieu de cela, j'ai dû utiliser quelque chose comme:
(Remarque: Interbase ne prend pas en charge le mot clé AS pour les alias)
la source
J'utilise ceci
et @TheTXI est suffisant, mais j'ai lu les réponses et les commentaires et j'ai trouvé qu'une chose à laquelle il fallait répondre était d'utiliser la condition dans la clause WHERE ou comme condition de jointure. J'ai donc décidé de le tester et d'écrire un extrait, mais je n'ai pas trouvé de différence significative entre eux. Vous pouvez voir le script sql ici et le point important est que j'ai préféré l'écrire en commnet car cette réponse n'est pas exacte mais elle est grande et ne peut pas être mise dans les commentaires, veuillez me pardonner.
Si vous pouvez obtenir une bonne raison de ce script ou en écrire un autre utile, veuillez le partager. Merci et j'espère que cette aide.
la source
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 souhaitez vous débarrasser de toutes les lignes de données dans la table des dépendants qui ne peuvent pas saisir avec toutes les lignes de la table principale.
Le point à noter ici est que vous collectez simplement un `` tableau '' d'EmpID à partir de la jointure, en utilisant cet ensemble d'EmpID pour effectuer une opération de suppression sur la table des dépendants.
la source
Dans SQLite, la seule chose qui fonctionne est quelque chose de similaire à la réponse de beauXjames.
Il semble se résumer à cela
DELETE FROM table1 WHERE table1.col1 IN (SOME TEMPORARY TABLE);
et que certaines tables temporaires peuvent être créées par SELECT et JOIN vos deux tables que vous pouvez filtrer cette table temporaire en fonction de la condition que vous souhaitez supprimer les enregistrements dans Table1.la source
vous pouvez exécuter cette requête: -
la source
La manière la plus simple est:
la source
Minimisez l'utilisation des requêtes DML avec les jointures. Vous devriez être capable de faire la plupart de toutes les requêtes DML avec des sous-requêtes comme ci-dessus.
En général, les jointures ne doivent être utilisées que lorsque vous devez sélectionner ou regrouper par colonnes dans 2 tables ou plus. Si vous touchez uniquement plusieurs tables pour définir une population, utilisez des sous-requêtes. Pour les requêtes DELETE, utilisez une sous-requête corrélée.
la source