IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes et SQL. Discussion :

Suppression avec une jointure ? [AC-2003]


Sujet :

Requêtes et SQL.

  1. #1
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    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.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  2. #2
    Responsable Access

    Avatar de Arkham46
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    5 865
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 5 865
    Points : 14 524
    Points
    14 524
    Par défaut
    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?)

  3. #3
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    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.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  4. #4
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 600
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 600
    Points : 56 698
    Points
    56 698
    Billets dans le blog
    40
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DELETE  DISTINCTROW TableDonnees.*
    FROM TableDonnees INNER JOIN TableParam ON TableDonnees.id = TableParam.id;

  5. #5
    Expert confirmé Avatar de Richard_35
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    3 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 3 121
    Points : 4 596
    Points
    4 596
    Par défaut
    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 :
    .../... 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 :
    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 !

  6. #6
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Merci F-leb, je vais essayer ton

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    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.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  7. #7
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    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.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  8. #8
    Membre du Club
    Inscrit en
    Mai 2008
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 76
    Points : 53
    Points
    53
    Par défaut
    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,

  9. #9
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 600
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 600
    Points : 56 698
    Points
    56 698
    Billets dans le blog
    40
    Par défaut
    '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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  10. #10
    Membre expérimenté
    Avatar de minot83
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mars 2006
    Messages
    972
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2006
    Messages : 972
    Points : 1 430
    Points
    1 430
    Par défaut
    Bonjour et Merci f_leb pour ce nouvel éclairage !
    si le message est pertinent : un petit si votre problème est résolu, n'oubliez pas le Tag Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Delete avec une jointure
    Par mazizou dans le forum Langage SQL
    Réponses: 2
    Dernier message: 13/07/2007, 13h24
  2. Utilisation de la fonction TOP avec une jointure
    Par pc75 dans le forum Requêtes et SQL.
    Réponses: 8
    Dernier message: 06/07/2007, 08h11
  3. [MySQL] probléme de repetition avec une jointure
    Par kenzo83220 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 21/11/2006, 17h24
  4. Réponses: 1
    Dernier message: 23/08/2006, 14h11
  5. [DB2] Problèmes avec une Jointure externe sur des vues
    Par treivse dans le forum Langage SQL
    Réponses: 6
    Dernier message: 11/07/2006, 11h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo