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

Access Discussion :

requête suppression/correction code


Sujet :

Access

  1. #1
    Membre averti
    Inscrit en
    Février 2006
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 56
    Par défaut requête suppression/correction code
    bonjour,
    j'essaye de faire une requête suppression sur ce modèle:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    DELETE Producteurs_2005_reman.PACilot, Producteurs_2005_reman.Dénomination, [doublons PACilot].culture_reclass, Producteurs_2005_reman.Surface_num
     
    FROM Producteurs_2005_reman INNER JOIN [doublons PACilot] ON Producteurs_2005_reman.PACilot = [doublons PACilot].PACilot
     
    WHERE ((([doublons PACilot].culture_reclass)="surface hors culture - aidée") AND ((Producteurs_2005_reman.Surface_num)<0.2));
    mais j'obtiens le message d'erreur suivant :
    specifier la table dans laquelle exécuter la requête...

    J'ai trouvé ici le même type de problème:
    http://www.developpez.net/forums/vie...te+suppression
    et j'aimerais donc contourner mon problème avec la même astuce (la clause IN), mais je ne maitrise pas assez le SQL pour corriger mon code...
    Quelle âme charitable voudrait bien m'expliquer?
    Merci

  2. #2
    Membre expérimenté

    Profil pro
    Inscrit en
    Mai 2004
    Messages
    236
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 236
    Par défaut
    Tu as plusieurs tables dans la clause FROM donc Access est perdu et ne sait plus dans quelles tables il doit supprimer.

    Tu peux essayer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    DELETE PACilot, Dénomination, culture_reclass, Surface_num
    FROM Producteurs_2005_reman 
    WHERE EXISTS (SELECT * FROM  [doublons PACilot] 
    WHERE [doublons PACilot].culture_reclass="surface hors culture - aidée" 
    AND Producteurs_2005_reman.PACilot = [doublons PACilot].PACilot
    AND Producteurs_2005_reman.Surface_num<0.2 );
    En espérant t'avoir aidé.

  3. #3
    Membre averti
    Inscrit en
    Février 2006
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 56
    Par défaut
    euh, c'est gentil, mais il a supprimé toute la table
    c'est du sabotage?

  4. #4
    Membre expérimenté

    Profil pro
    Inscrit en
    Mai 2004
    Messages
    236
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 236
    Par défaut
    Désolé, j'ai oublié une petite partie de la requête. Et ça ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    DELETE PACilot, Dénomination, culture_reclass, Surface_num
    FROM Producteurs_2005_reman as t1
    WHERE EXISTS (SELECT * FROM Producteurs_2005_reman as t2 INNER JOIN [doublons PACilot] as t3 ON t2.PACilot = t3.PACilot
    WHERE t3.culture_reclass="surface hors culture - aidée"
    AND t1.PACilot = t2.PACilot
    AND t2.Surface_num<0.2 );
    En espérant ne pas t'avoir encore saboté.

  5. #5
    Membre averti
    Inscrit en
    Février 2006
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 56
    Par défaut
    ce n'est toujours pas ça...les critères de sélection ne sont pas pris en compte, correctement, j'ai des parcelles de mais et de pommes de terres qui viennent se balader par là, et certaines sont plus grandes que 0.2ha, or ces parcelles doivent rester

    autre chose: est ce que je dois préciser toutes les colonnes concernées par la suppression, ou est ce que les lignes concernées sont supprimées automatiquement en entier?

  6. #6
    Membre éprouvé

    Inscrit en
    Mars 2004
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 92
    Par défaut
    Bonjour
    et mettre des ' comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE t3.culture_reclass=' "surface hors culture - aidée" '
    :

  7. #7
    Membre averti
    Inscrit en
    Février 2006
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 56
    Par défaut
    avec les ', il n'y a plus rien dans la requête, y a rien du tout qui se supprime...

  8. #8
    Membre expérimenté

    Profil pro
    Inscrit en
    Mai 2004
    Messages
    236
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 236
    Par défaut
    Et comme ça ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    DELETE PACilot, Dénomination, culture_reclass, Surface_num
    FROM Producteurs_2005_reman as t1
    WHERE EXISTS (SELECT * FROM Producteurs_2005_reman as t2 INNER JOIN [doublons PACilot] as t3 ON t2.PACilot = t3.PACilot
    WHERE t3.culture_reclass="surface hors culture - aidée"
    AND t1.PACilot = t2.PACilot)
    AND t1.Surface_num<0.2;

  9. #9
    Expert confirmé
    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
    Par défaut
    slt,

    pas besoin de préciser les colonnes, la suppression se fait par ligne entière

    avec IN ça me semble pourtant plus simple, genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    DELETE FROM Producteurs_2005_reman
    WHERE PACilot IN (SELECT PACilot FROM doublons PACilot WHERE culture_reclass="surface hors culture - aidée")
    AND Surface_num<0.2 );
    Enfin j'ai pas testé mais si j'ai bien compris la demande alors le IN est fait pour ça...

    En gros la sous-requête récupère tous les PACilot de la culture précisée et on vérifie si le PACilot de la table principale est dans cette liste.

  10. #10
    Membre averti
    Inscrit en
    Février 2006
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 56
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    DELETE FROM Producteurs_2005_reman
    WHERE PACilot IN (SELECT PACilot FROM doublons PACilot WHERE culture_reclass="surface hors culture - aidée")
    AND Surface_num<0.2 );
    il manque une paranthèse, non?
    Sinon, c'est exactement le genre de requête que je voulais...reste plus qu'à la faire fonctionner...

  11. #11
    Membre expérimenté

    Profil pro
    Inscrit en
    Mai 2004
    Messages
    236
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 236
    Par défaut
    La fonction exists et in sont identiques sauf que exists est plus rapide en terme d'exécution.

    En espérant t'avoir aidé.

  12. #12
    Membre averti
    Inscrit en
    Février 2006
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 56
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    DELETE Producteurs_2005_reman.PACilot, Producteurs_2005_reman.Surface_num
    FROM Producteurs_2005_reman
    WHERE (((Producteurs_2005_reman.PACilot) In (SELECT PACilot FROM  [rechercher les doublons PACilot] WHERE culture_reclass="surface hors culture - aidée")) AND ((Producteurs_2005_reman.Surface_num)<0.2));
    J'ai réussi à corriger le code (il manquait des crochets et une paranthèse, mais bon, c'est le premier truc que j'arrive à corriger de moi même, et j'en suis fière! ) et maintenant ça fonctionne.
    Merci à tous

  13. #13
    Expert confirmé
    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
    Par défaut
    Oui il manquait des morceaux, j'avais écris ça vite fait....

    La fonction exists et in sont identiques sauf que exists est plus rapide en terme d'exécution.
    Identiques j'en doute (au niveau des résultats oui bien sûr)
    mais il semblerait effectivement que EXISTS soit plus rapide, d'après ce que j'ai pû lire...
    Par contre dans ce cas IN est peut-être plus rapide que (EXISTS + une jointure).
    C'est surtout la jointure que je voulais faire disparaître et la syntaxe du IN est plus simple.

    Sarah, maintenant que tu es experte, tu nous fais des tests de performances?

Discussions similaires

  1. [AC-2013] Correction code d'envoi d'email contenant des infos basées sur requête
    Par Defaultuser01 dans le forum Access
    Réponses: 0
    Dernier message: 24/03/2014, 19h14
  2. Réponses: 2
    Dernier message: 09/02/2006, 07h53
  3. [C#] GridView suppression colonne code behind
    Par damn dans le forum ASP.NET
    Réponses: 2
    Dernier message: 31/10/2005, 12h33
  4. Requête suppression
    Par juju124 dans le forum Access
    Réponses: 10
    Dernier message: 28/09/2005, 15h52
  5. Réponses: 6
    Dernier message: 21/06/2005, 15h06

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