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 :

equivalent de la fonction SQL "exists" sous access [AC-2010]


Sujet :

Requêtes et SQL.

  1. #1
    Mut
    Mut est déconnecté
    Membre averti Avatar de Mut
    Homme Profil pro
    Inscrit en
    Mars 2003
    Messages
    931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Mars 2003
    Messages : 931
    Points : 307
    Points
    307
    Par défaut equivalent de la fonction SQL "exists" sous access
    Bonjour,


    J'aimerais dans une table insérer une données si celles ci n'existe pas ou bien si elle existe la mettre à jour. Je souhaiterais donc trouver une instruction qui combine les deux.
    Après quelques recherches infructueuses, j'ai trouvé la fonction "Exists" qui à l'air de très bien correspondre mais visiblement elle n'est pas dispo sur Access...

    Avez-vous un plan B ?

    Merci

  2. #2
    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 Mut,

    Si j'ai bien compris, tu as une table T1 qui contient des enregistrements présents ou non dans une table T2, via un champ Clé (clé unique) ; si ceux-ci sont présents, alors mise à jour de T2, sinon, création dans T2.

    Suggestion (via l'assistant, ça va tout seul) :
    • une requête "mise à jour" (UPDATE) qui lie T1 à T2 (FROM) via Clé sans flèche (INNER JOIN) => UPDATE des champs souhaités ;
    • une requête "ajout" (INSERT) qui lie T1 à T2 (FROM) via Clé (LEFT JOIN), qui ne sélectionne QUE T2.Clé Est Null (WHERE) ==> INSERT des champs souhaités.


    Attention :
    • Clé de T2 doit être unique (sinon, la requête "mise à jour" refusera de s'exécuter ;
    • Exécuter la requête "mise à jour" AVANT la requête "ajout" (tu devrais comprendre pourquoi).
    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 !

  3. #3
    Mut
    Mut est déconnecté
    Membre averti Avatar de Mut
    Homme Profil pro
    Inscrit en
    Mars 2003
    Messages
    931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Mars 2003
    Messages : 931
    Points : 307
    Points
    307
    Par défaut
    Merci de ta réponse.

    Cependant je bloque encore sur la requete insert.

    En fait ce n'est pas "Est null" qu'il faut que je mette mais plutot " not exist" car la clé de la table T1 n'est pas (encore) présente dans la table T2. Il faut justement l'insérer...

  4. #4
    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
    Citation Envoyé par Mut
    En fait ce n'est pas "Est null" qu'il faut que je mette mais plutot " not exist" .../...
    ==> c'est pareil : si la T2.Clé Est Null lors de la jonction avec T1 (donc T1.Clé n'existe pas dant T2), alors l'enregistrement concerné de T1 "not exist" dans T2.
    Je te suggère de faire le test.
    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 !

  5. #5
    Mut
    Mut est déconnecté
    Membre averti Avatar de Mut
    Homme Profil pro
    Inscrit en
    Mars 2003
    Messages
    931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Mars 2003
    Messages : 931
    Points : 307
    Points
    307
    Par défaut
    Effectivement...j'ai testé la requete select et ça à l'air de fonctionner...mon problème est du au fait que ma table T2 est composé de deux clés primaires (les clés étrangères de deux tables....+ un champ) et donc c'est la table T3 qui semble poser problème car si je l'ajoute dans la requete pour utiliser des champs afin d'effectuer un calcul, j'ai le problème des jointures ambigues...

    En résumé, j'ai trois table : T1,T2,T3 reliés entre elles. T1 à une clé unique tout comme T3. T2 reprend les clés primaires de T1 et T3 formant ainsi sa clé primaire (donc constituée de deux champs) + un champ "tarif". Ce que je cherche à faire c'est mettre à jour ou insérer des enregistrements dans T2 suivant des momdifications et/ou ajouts dans les tables T1 et T3.

  6. #6
    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
    Je n'ai pas bien compris.

    Peux-tu poster les structures de l'ensemble des tables concernées (uniquement leur(s) clé(s) primaire(s)) et une petite description ?
    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 !

  7. #7
    Mut
    Mut est déconnecté
    Membre averti Avatar de Mut
    Homme Profil pro
    Inscrit en
    Mars 2003
    Messages
    931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Mars 2003
    Messages : 931
    Points : 307
    Points
    307
    Par défaut
    Ouai effectivement c'était pas clair, j'ai édité mon message en espérant que ce soit un peu mieux.....

    Pour l'instant avec ton aide la mise à jour se passe très bien. Ca fonctionne.

    Le probleme est au niveau de l'insertion car en fait dans le "select" de la requete INSERT l'ajout doit se faire sur dans la table T2 (trois champs : les clés primaire de la table T1 et T3 + une valeur (tarif) determinée en fonction de champs dans la table T3 et T1).

    Le tarif est donc calculé dans la requete insert (avant d'etre insérer dans T2) par le biais de champs de la table T1 et T3.

    Je n'arrive donc pas à recupérer dans mon "SELECT" de la requete INSERT, l'ensemble des champs à insérer dans T2

  8. #8
    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
    Tu as modifié ton post en même temps que je te demandais les structures : OK.

    Citation Envoyé par Mut
    En résumé, j'ai trois table : T1,T2,T3 reliés entre elles. T1 à une clé unique tout comme T3. T2 reprend les clés primaires de T1 et T3 formant ainsi sa clé primaire (donc constituée de deux champs)
    ==>
    - tous les enregistrements de T1 sont-ils, forcément, présents dans T3 ?
    - tous les enregistrements de T3 sont-ils, forcément, présents dans T1 ?
    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 !

  9. #9
    Mut
    Mut est déconnecté
    Membre averti Avatar de Mut
    Homme Profil pro
    Inscrit en
    Mars 2003
    Messages
    931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Mars 2003
    Messages : 931
    Points : 307
    Points
    307
    Par défaut
    Non, en fait voici comment c'est structuré :

    T1(T1Key,NbHeure) ---------------T2(T1Key,T3Key,Tarif)------------T3(T3Key,Prix)


    Le tarif se calcule en fonction du prix de T3 et du Nbheure de T1.il fait parti des valeurs que je dois insérer...

  10. #10
    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
    Il n'y a qu'un seul "non", dans ta réponse : j'en conclut qu'il se rapporte à mes deux questions :
    - tous les enregistrements de T1 sont-ils, forcément, présents dans T3 ?
    ==> non.
    - tous les enregistrements de T3 sont-ils, forcément, présents dans T1 ?
    ==> non.

    Tu as bien une table T0 structurée comme suit :
    - T0Key (clé primaire)
    - Désignation
    ...
    ==> et qui contiendrait forcément tous les T1Key et tous les T3Key, non ?
    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 !

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


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 690
    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 690
    Points : 57 226
    Points
    57 226
    Billets dans le blog
    40
    Par défaut
    bonjour,

    j'ai pas bien saisi tout ce qui se passe dans ce fil, mais...

    Citation Envoyé par Mut Voir le message
    ... j'ai trouvé la fonction "Exists" qui à l'air de très bien correspondre mais visiblement elle n'est pas dispo sur Access...
    si si, elle est bien dispo sur Access (voir ici par exemple)

    Enfin bon, je vous dit ça comme ça hein

  12. #12
    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
    Bonsoir Fabien,

    Je peux me tromper, mais le problème de Mut me semble être plus méthodologique que syntaxique :
    Citation Envoyé par Mut
    Non, en fait voici comment c'est structuré :
    T1(T1Key,NbHeure) ---------------T2(T1Key,T3Key,Tarif)------------T3(T3Key,Prix)
    Citation Envoyé par Richard_35
    Il n'y a qu'un seul "non", dans ta réponse : j'en conclut qu'il se rapporte à mes deux questions :
    - tous les enregistrements de T1 sont-ils, forcément, présents dans T3 ?
    ==> non.
    - tous les enregistrements de T3 sont-ils, forcément, présents dans T1 ?
    ==> non.
    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 !

  13. #13
    Mut
    Mut est déconnecté
    Membre averti Avatar de Mut
    Homme Profil pro
    Inscrit en
    Mars 2003
    Messages
    931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Mars 2003
    Messages : 931
    Points : 307
    Points
    307
    Par défaut
    Effectivement, mon problème doit se situer entre les deux visiblement....

    Et oui le "non" correspond bien à tes deux questions car en fait T1 et T3 n'ont pas de liens direct entre elles.Seule la table T2 les relie entre elles avec les deux clés primaires (de T1 et T3) + un champ calculé....et je n'ai donc pas de table T0 qui contienne toutes les T1Key et les T3Key.


    T1=====> 0,N T2 0,N<==========T3



    T2 prend donc les deux clés primaire de T1 et T3 + un champ "tarif" qui est calculé en fonction d'autres champs de T1 et T3


    En fait ta fonction SQL insert fonctionne bien mais il faudrait ajouter une clause WHERE dessus !

  14. #14
    Mut
    Mut est déconnecté
    Membre averti Avatar de Mut
    Homme Profil pro
    Inscrit en
    Mars 2003
    Messages
    931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Mars 2003
    Messages : 931
    Points : 307
    Points
    307
    Par défaut
    J'ai trouvé un lien qui me conviendrait parfaitement à ce que je souhaite faire mais j'ai pas l'impression que ça fonctionne sous Access....

    exemple ici

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


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 690
    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 690
    Points : 57 226
    Points
    57 226
    Billets dans le blog
    40
    Par défaut
    Bonjour,

    T1(T1Key,NbHeure) ---------------T2(T1Key,T3Key,Tarif)------------T3(T3Key,Prix)

    Ce que je cherche à faire c'est mettre à jour ou insérer des enregistrements dans T2 suivant des modifications et/ou ajouts dans les tables T1 et T3.
    Si j’ajoute 3 lignes dans T1 (L10, L11,L12) , 2 lignes dans T3 (L30,L31).
    Quels sont les couples à former dans T2 ? :
    L10, L30 ?
    L10, L31 ?
    L11, L30 ?
    L11, L31 ?
    L12, L30 ?
    L12, L31 ?

    6 possibilités !

  16. #16
    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,

    Le point central est celui-ci :
    Tu as bien une table T0 structurée comme suit :
    - T0Key (clé primaire)
    - Désignation
    ...
    ==> et qui contiendrait forcément tous les T1Key et tous les T3Key, non ?
    ==> De cette manière, nous aurions, en primaire (1ère table du FROM), une table contenant l’exhaustivité des xxKey. Si cette table T0 n'existe pas, alors il faut, en quelque sorte, la créer à partir de T1 et T3.
    L'idée est de partir d'une table qui contiendrait un enregistrement par xxKey et de la lier à T1 et T3 (via un LEFT JOIN), l'exploitation finale sera alors aisée.
    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 !

  17. #17
    Mut
    Mut est déconnecté
    Membre averti Avatar de Mut
    Homme Profil pro
    Inscrit en
    Mars 2003
    Messages
    931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Mars 2003
    Messages : 931
    Points : 307
    Points
    307
    Par défaut
    Si j’ajoute 3 lignes dans T1 (L10, L11,L12) , 2 lignes dans T3 (L30,L31).
    Quels sont les couples à former dans T2 ? :
    L10, L30 ?
    L10, L31 ?
    L11, L30 ?
    L11, L31 ?
    L12, L30 ?
    L12, L31 ?

    6 possibilités !
    Oui c'est tout a fait ça

    L'idée est de partir d'une table qui contiendrait un enregistrement par xxKey et de la lier à T1 et T3 (via un LEFT JOIN), l'exploitation finale sera alors aisée.
    Pour moi, cette T0 dont tu parles est en fait la T2. En sachant que les cardinalités entre les tables sont "0,n".

    J'ai réglé mon soucis en passant par du vba pour l'instant....mais je souhaitais tout faire en SQL !

    Le problème étant assez "tordu" je vais l'expliquer en étant plus explicite :

    La table T1 representes des "Taches" avec comme champs : CodeTache,Nbheure, Type, genre. La table T3 est une table "clients" avec comme champs : CodeClient,etc,etc...

    Mon probleme est là : pour chaque client correspond un tarif de taches qui varie selon le nb d'heure, le type, le genre (et donc le client évidemment). Un tarif est négocié par genre et type de tache pour x heures. Il n'est pas envisageable pour l'utilisateur de lui faire remplir le tarif pour chaque type de taches par client (y'en aurait beaucoup trop !) c'est pourquoi j'ai crée cette table T2 (association de T1 et T3) que je souhaite remplir automatiquement pour le tarif qui me sera bien utile pour facilité les traitements par la suite.

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


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 690
    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 690
    Points : 57 226
    Points
    57 226
    Billets dans le blog
    40
    Par défaut
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT idTache, idClient, NbHeure*Prix as Tarif 
    FROM TableTache, TableClient
    WHERE NomClient="toto";

    renverra le tarif de chaque tache pour le client "toto".
    Le tout sans table T2.

  19. #19
    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
    Je me fourvoyais donc, pensant que les xxKey désignaient le même type d'entité sans doute à cause de l'objet du fil (EXISTS) qui, en final, n'intervient pas dans le problème soulevé.

    Pour arriver à l'exemple de Fabien, une astuce existe en créant la requête suivante (via l'assistant) :
    - ajouter la table T3 (FROM) ;
    - ajouter la table T1 (FROM) ;
    - ne pas les lier entre elles (c'est ça, l'astuce) ;
    - sélectionner les champs CodeClient et CodeTache (SELECT).
    ==> tu devrais obtenir, pour chaque client, l'ensemble des tâches disponibles.
    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 !

  20. #20
    Mut
    Mut est déconnecté
    Membre averti Avatar de Mut
    Homme Profil pro
    Inscrit en
    Mars 2003
    Messages
    931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Mars 2003
    Messages : 931
    Points : 307
    Points
    307
    Par défaut
    renverra le tarif de chaque tache pour le client "toto".
    Le tout sans table T2.
    Non car le "prix" dépend du type de tache, du genre, du nbheure et du client. Ce qui veut dire que dans ta/votre requete, je ne peux pas sélectionner un "prix" qui dépend de plusieurs autres champs. Voici un exemple concret :

    tache(0001,semaine,vente,5h) pour codeTache,Type,genre,NbHeure

    client(0001,500,600,700) pour codeClient, PrixVenteSemaine7h,PrixVenteDimanche7h,PrixVenteJourFerie7h

    Sachant que dans "tache", à la place de "vente" on peut avoir une autre action comme par exemple "livraison" et dans ce cas la il y aura aussi un prixlivraisonsemaine7h, prixlivraisondimanche7h etc.... dans la table client.



    Je me fourvoyais donc, pensant que les xxKey désignaient le même type d'entité sans doute à cause de l'objet du fil (EXISTS) qui, en final, n'intervient pas dans le problème soulevé.
    Effectivement...en fait j'ai l'impression que mon analyse de bdd est fausse et que "EXISTS" m'aurait aidé à contourner cette erreur....

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Equivalent de la fonction NVL sous oracle en SQL-server
    Par MorbidAngel dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 27/09/2005, 10h50

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