Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > Requêtes et SQL.
Requêtes et SQL. Tout ce qui concerne vos questions sur les requêtes et le SQL sous Access se trouve ici.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 18/01/2011, 20h27   #1
Modérateur
 
Homme René MAROT
Inscription : octobre 2005
Messages : 5 462
Détails du profil
Informations personnelles :
Nom : Homme René MAROT
Localisation : Canada

Informations forums :
Inscription : octobre 2005
Messages : 5 462
Points : 7 539
Points : 7 539
Par défaut Suppression avec une jointure ?

Bonjour à tous,

un petit problème qui me frustre depuis pas mal de temps.

J'ai une table, TableDonnees, qui contient des données.
J'ai une autre table, TableParam, qui contient des éléments présents dans TableDonnees. Par exemple, une liste de clefs primaires.

J'aimerai pouvoir supprimer tous les enregistrements de TableDonnees identifiés dans TableParam. Et avec une jointure cela ne marche pas !

Je peux bien sur utiliser DFirst() ou In(select ...) mais je trouve que cela manque de clarté et en plus c'est beaucoup moins rapide qu'une jointure.

Est-ce que je m'y prends mal ou on ne peut simplement pas faire cela ?

A+
__________________
Vous voulez une réponse rapide et efficace à vos questions téchniques ? Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
marot_r est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2011, 21h10   #2
Responsable Access
 
Avatar de Arkham46
 
Inscription : septembre 2003
Messages : 4 300
Détails du profil
Informations personnelles :
Localisation : France, Loiret (Centre)

Informations forums :
Inscription : septembre 2003
Messages : 4 300
Points : 7 936
Points : 7 936
salut

un enregistrement de la table TableDonnees pourrait potentiellement apparaître plusieurs fois dans le résultat de la requête (s'il y a des doublons dans TableParam) et la suppression n'est alors plus possible
pour pouvoir supprimer (je crois que c'est pareil pour modifier), il faut garantir que la requête ne renverra un enregistrement de la table qu'une seule fois

essaye donc pour cela d'ajouter un index sans doublon sur le (les) champ(s) de la table TableParam utilisé(s) pour la jointure
(j'imagine qu'il n'y a pas de doublons dans cette table?)
__________________
Assistant de création/modification de rubans Office
Utilisez en VBA les librairies graphiques GDI, GDI+ et openGL

Blog Office Mon Site DVP
Arkham46 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2011, 21h51   #3
Modérateur
 
Homme René MAROT
Inscription : octobre 2005
Messages : 5 462
Détails du profil
Informations personnelles :
Nom : Homme René MAROT
Localisation : Canada

Informations forums :
Inscription : octobre 2005
Messages : 5 462
Points : 7 539
Points : 7 539
Il n'y a pas de doublon dans TableParam mais, oui, il peut y avoir plusieurs enregistrements de TableDonnees qui corresponde à un de TableParam. Par exemple, je souhaite supprimer tous les enregistrements dont la période est égale à 2010-12.

Noter que les effacements ne se font que dans TableDonnees. TableParam sert simplement à choisir ceux qu'on veut éliminer.

Je ne cherche pas à résoudre un cas particulier j'aimerai un truc qui marche tout le temps si c'est possible.

A+
__________________
Vous voulez une réponse rapide et efficace à vos questions téchniques ? Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
marot_r est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2011, 22h33   #4
Expert Confirmé Sénior
 
Avatar de f-leb
 
Homme Fabien
Enseignant
Inscription : janvier 2009
Messages : 2 410
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 41
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Enseignant

Informations forums :
Inscription : janvier 2009
Messages : 2 410
Points : 4 439
Points : 4 439
bonsoir,

Citation:
Envoyé par marot_r Voir le message
J'aimerai pouvoir supprimer tous les enregistrements de TableDonnees identifiés dans TableParam. Et avec une jointure cela ne marche pas !
si tu cherches à faire:
Code sql :
1
2
DELETE  TableDonnees.*
FROM TableDonnees INNER JOIN TableParam ON TableDonnees.id = TableParam.id;

tu as effectivement le message "impossible de supprimer..."

Dans ce cas, on peut glisser un DISTINCTROW:
Code sql :
1
2
DELETE  DISTINCTROW TableDonnees.*
FROM TableDonnees INNER JOIN TableParam ON TableDonnees.id = TableParam.id;
f-leb est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 19/01/2011, 12h41   #5
Expert Confirmé
 
Avatar de Richard_35
 
Homme
Inscription : juillet 2007
Messages : 2 176
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Ille et Vilaine (Bretagne)

Informations forums :
Inscription : juillet 2007
Messages : 2 176
Points : 2 805
Points : 2 805
Bonjour à tous,

Je me suis permis de noter ce fil (Excellent) car c'est un sujet récurrent.

En effet, la phrase clé du sujet a été clairement rédigée par Arkham46 :
Citation:
.../... pour pouvoir supprimer (je crois que c'est pareil pour modifier), il faut garantir que la requête ne renverra un enregistrement de la table qu'une seule fois .../...
ou ne renverra qu'un seul enregistrement de la table concernée par la suppression/mise à jour. Car, effectivement, cela concerne également les "requêtes mises à jour", d'où le fameux message :
Citation:
L'opération doit utiliser une requête qui peut être mise à jour
à l'origine de nombreux fils, donc.
__________________
Dis-nous et à bientôt,
Richard.
----------------------------------------------------------------------------------------------
En cas de résolution, et afin de faciliter la tâche des bénévoles, merci de cliquer sur .
et permettent aux forumeurs de cibler leur recherche dans une discussion : n'hésitez pas à voter !
Richard_35 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 19/01/2011, 14h24   #6
Modérateur
 
Homme René MAROT
Inscription : octobre 2005
Messages : 5 462
Détails du profil
Informations personnelles :
Nom : Homme René MAROT
Localisation : Canada

Informations forums :
Inscription : octobre 2005
Messages : 5 462
Points : 7 539
Points : 7 539
Merci F-leb, je vais essayer ton

Code sql :
1
2
DELETE  DISTINCTROW TableDonnees.*
FROM TableDonnees INNER JOIN TableParam ON TableDonnees.id = TableParam.id;

À priori toutes mes lignes sont déjà distinctes donc je devrais avoir le résultat attendu.

A+
__________________
Vous voulez une réponse rapide et efficace à vos questions téchniques ? Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
marot_r est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/01/2011, 20h37   #7
Modérateur
 
Homme René MAROT
Inscription : octobre 2005
Messages : 5 462
Détails du profil
Informations personnelles :
Nom : Homme René MAROT
Localisation : Canada

Informations forums :
Inscription : octobre 2005
Messages : 5 462
Points : 7 539
Points : 7 539
Merci ça marche parfaitement.

Je vais pouvoir supprimer mes requêtes paramétrées.

A+
__________________
Vous voulez une réponse rapide et efficace à vos questions téchniques ? Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
marot_r est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2011, 11h48   #8
Candidat au titre de Membre du Club
 
Inscription : mai 2008
Messages : 63
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 63
Points : 14
Points : 14
Bonjour,

Je me permet de réagir sur ce sujet, puisque j'ai une question sur le même problème :


Concernant la solution de f-leb
- Je n'ai pas bien compris, cette solution peux-elle s'appliquer alors qu'il y a des doublons dans la table 'TableDonnees'?
- Qu'en est-il du code SQL si les tables ont des jointures sur plusieurs champs? (ps : je suis un novice absolu en SQL )

Merci,
gandalf20000000 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2011, 19h23   #9
Expert Confirmé Sénior
 
Avatar de f-leb
 
Homme Fabien
Enseignant
Inscription : janvier 2009
Messages : 2 410
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 41
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Enseignant

Informations forums :
Inscription : janvier 2009
Messages : 2 410
Points : 4 439
Points : 4 439
'soir,

personne t'as prévenu ? DISTINCTROW ou l'exemple parfait de l'absurdité d'Access !

pour info, on peut très bien revenir à du SQL standard et obtenir la même chose en écrivant:

Code sql :
1
2
DELETE TableDonnees.* FROM TableDonnees
WHERE EXISTS (SELECT NULL FROM TableParam WHERE TableParam.id = TableDonnees.id) ;

ouf, Access connait Exists

Sinon tu devrais ouvrir une nouvelle discussion et donner plus de détails, ce n'est apparemment pas le même problème.
f-leb est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 05/02/2011, 10h58   #10
Membre confirmé
 
Avatar de minot83
 
Homme
Administrateur de base de données
Inscription : mars 2006
Messages : 285
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Administrateur de base de données

Informations forums :
Inscription : mars 2006
Messages : 285
Points : 231
Points : 231
Bonjour et Merci f_leb pour ce nouvel éclairage !
minot83 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 23h54.


 
 
 
 
Partenaires

Hébergement Web