web-dev-qa-db-fra.com

Comment supprimer dans MS Access lors de l'utilisation de JOIN?

J'essaie d'utiliser la clause DELETE dans MS Access et j'ai un problème lorsque j'utilise également la clause JOIN. J'ai remarqué que cela peut être accompli en utilisant le mot clé DISTINCTROW.

Par exemple, l'instruction SQL suivante n'autorise pas la suppression:

DELETE Table1.*
FROM Table1 INNER JOIN Table2 ON Table1.Name=Table2.Name;

Cependant, cette déclaration:

DELETE DISTINCTROW Table1.*
FROM Table1 INNER JOIN Table2 ON Table1.Name=Table2.Name;
  • Pourquoi le DELETE fonctionne-t-il lors de l'utilisation du mot clé DISTINCTROW?
  • Plus précisément, que se passe-t-il dans le moteur JET pour exiger cela?
24
Delete Table1.*
From Table1
Where Exists( Select 1 From Table2 Where Table2.Name = Table1.Name ) = True

Pour développer ma réponse, la spécification SQL officielle ne prévoit pas l'utilisation de jointures dans les requêtes d'action spécifiquement parce qu'elle peut créer des résultats ambigus. Ainsi, il est préférable (et Access est beaucoup plus heureux) si vous pouvez éviter d'utiliser des jointures dans des requêtes d'action comme je l'ai ici. La raison pour laquelle Access souhaite DISTINCTROW est qu'il est probable que la jointure entre les deux tables crée des doublons de lignes Table1 (c'est-à-dire qu'il y a plusieurs lignes liées dans Table2) et qu'Access soit donc confus. J'ai également constaté que si vous essayez d'utiliser une jointure et qu'une clé primaire n'existe pas, Access rechignera. En général, il est préférable d'éviter une jointure dans une requête d'action si vous le pouvez.

24
Thomas

Un problème à savoir: cela ne fonctionne PAS avec les alias de table/requête!

DELETE a.*
from tblA as A
where exists (select 1 from tblB as B where a.id=b.id)

Supprime TOUS les enregistrements dans tblA! Je l'ai essayé en utilisant alias pour tblA et tblB séparément - même résultat (Access 2010).

Cela arrive aussi avec SELECT (que j'utilise souvent avant de supprimer) ...

3
MarcusFey
DELETE a.*
FROM tblA AS A
WHERE EXISTS (SELECT 1 FROM tblB AS B WHERE a.id=b.id)

essaye ça

DELETE tblA 
FROM tblB  
WHERE EXISTS (SELECT * FROM tblA AS A,tblB AS B WHERE A.id=B.id)
0
user7047561