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 17/08/2011, 14h10   #1
Mut
Membre confirmé
 
Avatar de Mut
 
Inscription : mars 2003
Messages : 789
Détails du profil
Informations personnelles :
Âge : 28
Localisation : France, Seine Maritime (Haute Normandie)

Informations forums :
Inscription : mars 2003
Messages : 789
Points : 237
Points : 237
Envoyer un message via MSN à Mut
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
Mut est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/08/2011, 14h43   #2
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 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 !
Richard_35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/08/2011, 15h16   #3
Mut
Membre confirmé
 
Avatar de Mut
 
Inscription : mars 2003
Messages : 789
Détails du profil
Informations personnelles :
Âge : 28
Localisation : France, Seine Maritime (Haute Normandie)

Informations forums :
Inscription : mars 2003
Messages : 789
Points : 237
Points : 237
Envoyer un message via MSN à Mut
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...
Mut est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/08/2011, 15h21   #4
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
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 !
Richard_35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/08/2011, 15h53   #5
Mut
Membre confirmé
 
Avatar de Mut
 
Inscription : mars 2003
Messages : 789
Détails du profil
Informations personnelles :
Âge : 28
Localisation : France, Seine Maritime (Haute Normandie)

Informations forums :
Inscription : mars 2003
Messages : 789
Points : 237
Points : 237
Envoyer un message via MSN à Mut
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.
Mut est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/08/2011, 16h22   #6
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
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 !
Richard_35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/08/2011, 16h48   #7
Mut
Membre confirmé
 
Avatar de Mut
 
Inscription : mars 2003
Messages : 789
Détails du profil
Informations personnelles :
Âge : 28
Localisation : France, Seine Maritime (Haute Normandie)

Informations forums :
Inscription : mars 2003
Messages : 789
Points : 237
Points : 237
Envoyer un message via MSN à Mut
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
Mut est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/08/2011, 16h48   #8
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
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 !
Richard_35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/08/2011, 16h54   #9
Mut
Membre confirmé
 
Avatar de Mut
 
Inscription : mars 2003
Messages : 789
Détails du profil
Informations personnelles :
Âge : 28
Localisation : France, Seine Maritime (Haute Normandie)

Informations forums :
Inscription : mars 2003
Messages : 789
Points : 237
Points : 237
Envoyer un message via MSN à Mut
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...
Mut est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/08/2011, 17h04   #10
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
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 !
Richard_35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/08/2011, 19h51   #11
Expert Confirmé Sénior
 
Avatar de f-leb
 
Homme Fabien
Enseignant
Inscription : janvier 2009
Messages : 2 415
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 415
Points : 4 446
Points : 4 446
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
f-leb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/08/2011, 20h41   #12
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
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 !
Richard_35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/08/2011, 00h27   #13
Mut
Membre confirmé
 
Avatar de Mut
 
Inscription : mars 2003
Messages : 789
Détails du profil
Informations personnelles :
Âge : 28
Localisation : France, Seine Maritime (Haute Normandie)

Informations forums :
Inscription : mars 2003
Messages : 789
Points : 237
Points : 237
Envoyer un message via MSN à Mut
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 !
Mut est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/08/2011, 10h04   #14
Mut
Membre confirmé
 
Avatar de Mut
 
Inscription : mars 2003
Messages : 789
Détails du profil
Informations personnelles :
Âge : 28
Localisation : France, Seine Maritime (Haute Normandie)

Informations forums :
Inscription : mars 2003
Messages : 789
Points : 237
Points : 237
Envoyer un message via MSN à Mut
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
Mut est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/08/2011, 10h19   #15
Expert Confirmé Sénior
 
Avatar de f-leb
 
Homme Fabien
Enseignant
Inscription : janvier 2009
Messages : 2 415
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 415
Points : 4 446
Points : 4 446
Bonjour,

Citation:
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 !
f-leb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/08/2011, 10h46   #16
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,

Le point central est celui-ci :
Citation:
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 !
Richard_35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/08/2011, 11h36   #17
Mut
Membre confirmé
 
Avatar de Mut
 
Inscription : mars 2003
Messages : 789
Détails du profil
Informations personnelles :
Âge : 28
Localisation : France, Seine Maritime (Haute Normandie)

Informations forums :
Inscription : mars 2003
Messages : 789
Points : 237
Points : 237
Envoyer un message via MSN à Mut
Citation:
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

Citation:
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.
Mut est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/08/2011, 11h59   #18
Expert Confirmé Sénior
 
Avatar de f-leb
 
Homme Fabien
Enseignant
Inscription : janvier 2009
Messages : 2 415
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 415
Points : 4 446
Points : 4 446
Code sql :
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.
f-leb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/08/2011, 12h01   #19
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
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 !
Richard_35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/08/2011, 12h32   #20
Mut
Membre confirmé
 
Avatar de Mut
 
Inscription : mars 2003
Messages : 789
Détails du profil
Informations personnelles :
Âge : 28
Localisation : France, Seine Maritime (Haute Normandie)

Informations forums :
Inscription : mars 2003
Messages : 789
Points : 237
Points : 237
Envoyer un message via MSN à Mut
Citation:
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.



Citation:
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....
Mut 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 06h55.


 
 
 
 
Partenaires

Hébergement Web