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;
DELETE
fonctionne-t-il lors de l'utilisation du mot clé DISTINCTROW
?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.
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) ...
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)