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 d'enregistrements d'une table 1, si ces derniers ne sont pas utilisés dans table 2 et 3


Sujet :

Requêtes et SQL.

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 46
    Points : 18
    Points
    18
    Par défaut Suppression d'enregistrements d'une table 1, si ces derniers ne sont pas utilisés dans table 2 et 3
    Bonjour à tous
    J'ai à nouveau besoin d'aide :

    soit 3 tables :

    Table 1 : Table des articles (dans laquelle je veux supprimer des enregistrements)
    Table 2 : Table des repères de devis
    Table 3 : Table des repères de cde

    Champ commun aux 3 tables : [N°_article]

    Ce que je veux faire :

    Si pas d'enregistrement dans table 2 et table 3
    alors je supprime l'enregistrement dans la table 1

    ce que j'arrive à faire :
    en faisant une requête comme ceci

    Nom : 1.jpg
Affichages : 2966
Taille : 125,3 Ko

    J'arrive bien à obtenir les articles de la Table 1 non utilisés dans Table 2 et 3 :


    Nom : 2.jpg
Affichages : 1372
Taille : 16,9 Ko


    Par contre c'est la que je sèche , j'essaye de faire une requête de suppression
    Mais access ne me laisse pas effacer ces enregistrements.

    Pourriez vous m'aider svp

    Merci

  2. #2
    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
    Bonjour.

    D'abord, il ne faut pas utiliser une requête de regroupement mais une requête standard (select).
    Les requête de regroupement ne permettent pas de modifier les données.
    Ensuite au lieu du =0 comme critère il faut mettre Is Null.
    Après tu n'as plus qu'à supprimer les enregistrements affichés.

    Une autre méthode, plus brutale et utilisable si tu as défini des relations avec intégrité référentielles (ce que je t'invite à toujours faire) consiste à demander de supprimer TOUS les enregistrements de ta table article.
    Grâce à l'intégrité référentielle Access va savoir que certains enregistrements sont utilisés dans les autres tables et va te signaler l'erreur.
    Il suffit d'ignorer les erreurs et Access va supprimer seulement ceux qui ne sont pas utilisés.

    Même si la 2nde méthode marche, personnellement j'ai une préférence pour la 1ère qui me permet de savoir quels sont les enregistrements qui vous être supprimés avant leur suppression.

    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.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 46
    Points : 18
    Points
    18
    Par défaut
    Merci de tes infos

    Mais justement je sèche un peu pour faire une requête SELECT...
    Pourrais tu me donner le début du chemin à développer?

    Car je ne vois vraiment pas comment faire.

    En te remerciant

  4. #4
    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
    Bonjour.

    C'est la même que ta requête de comptage, tu as juste à la changer pour "Type Select".

    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.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 46
    Points : 18
    Points
    18
    Par défaut
    Désolé, j'ai beau relire ce que tu me dit :
    voila ce que j'ai dans ma requete :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT Tbl_Articles.N°_article, Count(Tbl_Devis_rep.N°_article) AS CompteDeN°_article, Count(Tbl_Cde_Clients_rep.N°_article) AS CompteDeN°_article1
    FROM (Tbl_Articles LEFT JOIN Tbl_Devis_rep ON Tbl_Articles.N°_article = Tbl_Devis_rep.N°_article) LEFT JOIN Tbl_Cde_Clients_rep ON Tbl_Articles.N°_article = Tbl_Cde_Clients_rep.N°_article
    GROUP BY Tbl_Articles.N°_article
    Having (((Tbl_Articles.N°_article)<9000000) AND ((Count(Tbl_Devis_rep.N°_article))=0) AND ((Count(Tbl_Cde_Clients_rep.N°_article))=0));

    J'ai bien compris qu'il fallait que je n'utilise pas de regroupement, mais une requête "standard"
    Mais si je désactive par l'icone "Totaux" je n'ai plus les champs comptés

    Excuse moi, je suis assez à l'aise avec vba mais le SQL ça pêche un peu chez moi.

  6. #6
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 648
    Points : 14 626
    Points
    14 626
    Par défaut
    Bonjour,
    faut-il absolument compter le nombre d'enregistrements avant de les supprimer ?
    Si oui, tu utilises ta requête de regroupement actuelle pour compter, ensuite tu utilises celle-ci pour supprimer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DELETE * FROM tbl_articles
    WHERE (tbl_articles.[N°_article] < 9000000) AND (tbl_articles.[N°_article] Not In (select [N°_article] from [Tbl_devis_rep])) AND ([tbl_articles.[N°_article] Not In (select [N°_article] from Tbl_Cde_clients_rep));
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  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
    Bonjour.

    Oui c'est normal que tu n'est plus le comptage il est remplacé par le test sur Is Null (est Null en français).
    Si C'est null, c'est qu'il n'y a pas d'enregistrement associé donc c'est l'équivalent d'un = 0.

    Le code devrait probablement être :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT Tbl_Articles.N°_article, Count(Tbl_Devis_rep.N°_article) AS CompteDeN°_article, Count(Tbl_Cde_Clients_rep.N°_article) AS CompteDeN°_article1
     FROM (Tbl_Articles LEFT JOIN Tbl_Devis_rep ON Tbl_Articles.N°_article = Tbl_Devis_rep.N°_article) LEFT JOIN Tbl_Cde_Clients_rep ON Tbl_Articles.N°_article = Tbl_Cde_Clients_rep.N°_article
     where Tbl_Articles.N°_article)<9000000) AND Tbl_Devis_rep.N°_article is null AND Tbl_Cde_Clients_rep.N°_article is null;

    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 à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 46
    Points : 18
    Points
    18
    Par défaut
    Bonjour à vous et merci pour toutes ces informations

    Je teste dès lundi et je vous tiendrai informé

    En tout cas encore merci de l'intérêt que vous portez à mon pb

    Bon Weekend

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 46
    Points : 18
    Points
    18
    Par défaut
    Ok j'ai fait les essais :

    La solution proposée par tee_grandbois :

    ça n'a pas l'air de fonctionner, j'essaye d’exécuter la requête, mais ça tourne et tourne encore et puis rien.

    La solution proposée par marot_r :

    J'ai copié ton sql et effectivement j'arrive au même résultat qu'avant avec la condition null
    Donc nous avons bien une requête de selection
    voir ci dessous :
    Nom : 3.jpg
Affichages : 1508
Taille : 153,0 Ko

    Mais après j'essaye de créer une requête de suppression
    et là impossible...
    Voici le message que j'obtiens :
    Nom : 4.jpg
Affichages : 1355
Taille : 10,7 Ko


    Et pourtant je spécifie bien la table des articles (puisque c'est là ou il faut les supprimer) mais ça ne fonctionne pas.

  10. #10
    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
    Bonjour.

    Mais après j'essaye de créer une requête de suppression
    Tu as bien simplement changé le type de Sleect à Suppression, n'est-ce pas ?

    Vérifie aussi que les champs de test ne sont pas cochés pour affichage dans la requête de suppression, cela vient peut-être de là.

    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.

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 46
    Points : 18
    Points
    18
    Par défaut
    Oui je l'ai juste changé en suppression

    Par contre la il me demande de spécifier la table dans laquelle je veux supprimer les enregistrements
    j'affiche donc la tbl_article

    Ensuite j'ai vérifié que ça ne soit pas cocher , mais de toute façon dans une requête de suppression les coches disparaissent automatiquement

    J'ai même essayé d'insérer la requête de sélection dans une nouvelle requête de suppression en la liant avec la tbl_articles

    mais là le même message : impossible de supprimer dans les tables spécifiés....

    PAR CONTRE J'ai fait un TEST :
    A la place d'une requête de suppression j'ai fait une requête de Mise à jour

    Et là : CA FONCTIONNE!!!!!!!

    Mais pourquoi? Aucune idée ..... Grrrrr


    Alors Bon du coup je me dis, je le fais en 2 étapes

    1 Requête MAJ puis en 2 une requête qui supprime tous les articles = à 0

    Mais bon c'est un peu de la bricole....

  12. #12
    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
    Étrange.

    Est-ce que ta table tblArticle ne serait as en relation avec une 3ième table ?

    Sinon repère un des articles à supprimer et va directement dans ta table est essaye de le supprimer.

    Fait une sauvegarde avant.

    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.

  13. #13
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 648
    Points : 14 626
    Points
    14 626
    Par défaut
    Bonjour,
    peux-tu poster le SQL de ta requête de suppression ?
    Pour ma solution, comme elle n'utilise pas de tables jointes elle pourrait fonctionner à condition de mettre un index sur les champs N°_Article dans les tables Tbl_Cde_Clients_rep et Tbl_Devis_rep pour accélérer le traitement.
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 46
    Points : 18
    Points
    18
    Par défaut
    Alors quand je supprime directement dans la table un enregistrement dans Tbl_articles, cela fonctionne ...

    J'ai une requête de suppression avec laquelle j'efface directement des N°_articles et elle fonctionne.
    Mais justement je voudrais utilisé cette requête ci car si j'efface un article qui est utilisé dans d'autres tables , ça va foutre le bazar dans les devis et les cdes.


    Voici ci dessous mes 3 tables , N°_article est indexé :
    Nom : 5.jpg
Affichages : 1456
Taille : 410,9 Ko


    et voici le code sql de la requête de suppression :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    DELETE Tbl_Articles.N°_article, Tbl_Devis_rep.N°_article, Tbl_Cde_Clients_rep.N°_article, Tbl_Articles.*
    FROM (Tbl_Articles LEFT JOIN Tbl_Devis_rep ON Tbl_Articles.N°_article = Tbl_Devis_rep.N°_article) LEFT JOIN Tbl_Cde_Clients_rep ON Tbl_Articles.N°_article = Tbl_Cde_Clients_rep.N°_article
    WHERE (((Tbl_Articles.N°_article)<9000000) AND ((Tbl_Devis_rep.N°_article) Is Null) AND ((Tbl_Cde_Clients_rep.N°_article) Is Null));


    Après je pense que ce SQL n'est pas top, comme dit précédemment je rame avec le SQL un peu complexe...

  15. #15
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 648
    Points : 14 626
    Points
    14 626
    Par défaut
    essaie d'enlever les références des autres tables dans la clause DELETE :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    DELETE  Tbl_Articles.*
    FROM (Tbl_Articles LEFT JOIN Tbl_Devis_rep ON Tbl_Articles.N°_article = Tbl_Devis_rep.N°_article) LEFT JOIN Tbl_Cde_Clients_rep ON Tbl_Articles.N°_article = Tbl_Cde_Clients_rep.N°_article
    WHERE (((Tbl_Articles.N°_article)<9000000) AND ((Tbl_Devis_rep.N°_article) Is Null) AND ((Tbl_Cde_Clients_rep.N°_article) Is Null));
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  16. #16
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 46
    Points : 18
    Points
    18
    Par défaut
    Je viens d'essayer ton sql :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    DELETE  Tbl_Articles.*
    FROM (Tbl_Articles LEFT JOIN Tbl_Devis_rep ON Tbl_Articles.N°_article = Tbl_Devis_rep.N°_article) LEFT JOIN Tbl_Cde_Clients_rep ON Tbl_Articles.N°_article = Tbl_Cde_Clients_rep.N°_article
    WHERE (((Tbl_Articles.N°_article)<9000000) AND ((Tbl_Devis_rep.N°_article) Is Null) AND ((Tbl_Cde_Clients_rep.N°_article) Is Null));
    J'ai aussi tenté de le faire comme ceci , en mettant ma requête de selection liée à la table article :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DELETE Tbl_Articles.*
    FROM Tbl_Articles INNER JOIN R_suppression_articles_non_utilisés_sélection ON Tbl_Articles.N°_article = R_suppression_articles_non_utilisés_sélection.N°_article;

    Mais j'ai le même message pour les 2 SQL : impossible de supprimer dans les tables spécifiés

    Et si je vais dans ma tbl_articles , et que je supprime directement l'enregistrement, ça fonctionne.

    Je ne comprends vraiment pas la

  17. #17
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 648
    Points : 14 626
    Points
    14 626
    Par défaut
    Bonjour,
    question pas encore posée : combien d'enregistrements dans tes tables ?
    J'en reviens à ma solution est-ce qu'en 2 requêtes cela pourrait fonctionner ?:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    DELETE * FROM tbl_articles
    WHERE (tbl_articles.[N°_article] < 9000000) 
    AND (tbl_articles.[N°_article] Not In (select [N°_article] from [Tbl_devis_rep]));
     
    DELETE * FROM tbl_articles
    WHERE (tbl_articles.[N°_article] < 9000000)
    AND ([tbl_articles.[N°_article] Not In (select [N°_article] from Tbl_Cde_clients_rep));
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  18. #18
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 46
    Points : 18
    Points
    18
    Par défaut
    Bonjour

    Dans la tbl_articles environ 20000 enregistrements

    En fait oui en 2 requêtes je pense que cela fonctionne sans soucis

    Mais le problème et que si j’exécute les 2 requêtes :
    Il m'effacera l'article qui n'a pas de cde mais qui peut très bien avoir un devis et vice versa...

    C'est pour cela qu'il faut absolument que je teste la condition qu'il ne soit ni dans la tbl commande ni dans la tbl offre.

    Comme j'ai répondu précédemment, je pense avoir une astuce en faisant d'abord une requête de mise à jour puisque cela fonctionne en attribuant un N° autre que mon article précédent et ensuite de supprimer tous les enregistrements qui sont supérieur à ce numéro par ex.
    Ca fait un peu de la bidouille mais ça marche

    C'est juste dommage que je n'arrive pas à trouver pourquoi je n'arrive pas à supprimer d'après cette requête qui contient ces 2 conditions.

  19. #19
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 648
    Points : 14 626
    Points
    14 626
    Par défaut
    à mon sens,faire une requête de suppression sur 1 table et des jointures ouvertes sur 2 autres, c'est un peu contre-nature vis à vis du SQL natif.
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

Discussions similaires

  1. Suppression d'enregistrement d'une table sous une page .jsp
    Par zakarinalaw dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 20/05/2013, 08h50
  2. Réponses: 2
    Dernier message: 07/12/2007, 15h20
  3. Réponses: 4
    Dernier message: 22/05/2006, 14h22
  4. Réponses: 3
    Dernier message: 01/12/2005, 10h17

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