OVH Cloud OVH Cloud

demande de requete

8 réponses
Avatar
je cherche la bonne requete et je n'arrive pas =E0 la=20
trouver ! Merci de votre aide

j'ai deux tables tableA et TableB dans la m=EAme base

chacune de ces tables contient 5 champs (en fait il y en=20
a d'autres mais je veux faire une s=E9lection sur ces 5=20
champs):

champs "date" de type date/time
champs "executant" de type text qui peut prendre 2=20
valeurs soit "as" soit "veilleur"
champs "nom" de type text
champs "prenom" de type text
champs "action" de type text

je cherche une requ=EAte me permettant se s=E9lectionner tous=20
les enregistrements de la tableA qui ne sont pas=20
strictement identiques =E0 ceux de tableB pour ces 5 champs

par exemple l'enregistrement suivant de la tableA
14/01/2005 as BOBO paul manger
doit =EAtre retenu m=EAme si les 2 enregistrements suivants=20
dans tableB sont pr=E9sents
13/01/2005 as BOBO paul manger
14/01/2005 veilleur BOBO paul manger

j'ai essay=E9 avec=20
SELECT * From tableA WHERE (tableA.date not in (select=20
date from tableB)) or (tableA.executant not in (select=20
executant from tableB)) or (tableA.nom not in (select nom=20
from tableB)) or (tableA.prenom not in (select prenom=20
from tableB)) or (tableA.action not in (select action=20
from tableB))

mais cela me redouble des enregistrements...Piti=E9 et=20
merci de votre r=E9ponse
Fran=E7ois

8 réponses

Avatar
3stone
Salut,

a écrit
j'ai deux tables tableA et TableB dans la même base
chacune de ces tables contient 5 champs (en fait il y en
a d'autres mais je veux faire une sélection sur ces 5
champs):

champs "date" de type date/time
champs "executant" de type text qui peut prendre 2
valeurs soit "as" soit "veilleur"
champs "nom" de type text
champs "prenom" de type text
champs "action" de type text

je cherche une requête me permettant se sélectionner tous
les enregistrements de la tableA qui ne sont pas
strictement identiques à ceux de tableB pour ces 5 champs
<snip>

c1, c2, c3 pour les noms de champ...


SELECT tbl_A.c1, tbl_A.c2, tbl_A.c3
FROM tbl_A LEFT JOIN tbl_B
ON (tbl_A.c1 = tbl_B.c1) AND (tbl_A.c2 = tbl_B.c2) AND (tbl_A.c3 = tbl_B.c3)
WHERE (((tbl_B.c1) Is Null));


--
A+
Pierre (3stone) Access MVP
Perso: http://users.skynet.be/accesshome/
Conseils MPFA: http://users.skynet.be/mpfa/
Email : http://www.cerbermail.com/?Xfg61Z3IQw
Avatar
Désolé mais ça ne marche pas non plus, je ne comprends
d'ailleurs pas la necessité de la condition null dans la
dernière partie de la requete
françois
Avatar
Philippe T [MS]
Bonjour,

Peut être :

SELECT tbl_A.c1, tbl_A.c2, tbl_A.c3, tbl_A.c4, tbl_A.c5
FROM tbl_A
LEFT OUTER JOIN tbl_B ON (tbl_A.c1 = tbl_B.c1) AND (tbl_A.c2 = tbl_B.c2)
AND (tbl_A.c3 = tbl_B.c3) AND (tbl_A.c4 = tbl_B.c4) AND (tbl_A.c5 tbl_B.c5);


Phil.
________________________________________________________
Philippe TROTIN http://blogs.msdn.com/ptrotin
Microsoft Services France http://www.microsoft.com/france

wrote in message
news:187f01c4fa7d$ae3f5a60$
Désolé mais ça ne marche pas non plus, je ne comprends
d'ailleurs pas la necessité de la condition null dans la
dernière partie de la requete
françois
Avatar
3stone
Salut,

Désolé mais ça ne marche pas non plus, je ne comprends
d'ailleurs pas la necessité de la condition null dans la
dernière partie de la requete


C'est moi qui suis désolé...

car cette requête donne ce que tu demande:
les enregistrements de la table A qui ne sont PAS identique à la table B

que tu ne comprenne pas le Null... ;-)

PS: Bien sûr, tu devais inclure *tous* les champs !


--
A+
Pierre (3stone) Access MVP
Perso: http://users.skynet.be/accesshome/
Conseils MPFA: http://users.skynet.be/mpfa/
Email : http://www.cerbermail.com/?Xfg61Z3IQw
Avatar
merci de te pencher sur mon problème mais je ne suis pas
sur qu'ACCESS supporte outer join en tout cas sous VB6,
on ne peut utiliser cette instruction dans une requete
SQL. Le pire c'est que

SELECT * FROM table1 WHERE (((table1.nom) Not In (SELECT
nom FROM table2))) or (((table1.prenom) Not In (SELECT
prenom FROM table2)))

marche parfaitement mais que

SELECT * FROM table1 WHERE (((table1.nom) Not In (SELECT
nom FROM table2))) or (((table1.prenom) Not In (SELECT
prenom FROM table2))) or (((table1.date) Not In (SELECT
date FROM table2)))

sort tous les enregistrements de table1 même s'ils sont
présents dans table2. Il semblerait que ce soit le
champs "date" qui fasse planter la requete...mais
pourquoi ??
Avatar
en reprenant ta requete sous cette forme adaptée à ma
table

SELECT Table1.nom, Table1.prenom, Table1.date
FROM Table1 LEFT JOIN Table2 ON (Table1.date =
Table2.date) AND (Table1.prenom = Table2.prenom) AND
(Table1.nom = Table2.nom)
WHERE (((Table2.nom) Is Null));

cela marche effectivement ! mais je ne comprends pas la
clause where (bon je suis pas très expérimenté, tu t'en
étais rendu compte !!) car à priori que l'on teste la
valeur nulle pour Table2.nom ou Table2.prenom ou
Table2.date, le résultat est identique. Merci de
m'éclairer, je ne voudrais pas mourir idiot !!
En tout cas merci de ta réponse qui va bien m'arranger et
merci de t'être penché sur mon problème !
Bonne soirée
François
Avatar
3stone
re,

en reprenant ta requete sous cette forme adaptée à ma
table

SELECT Table1.nom, Table1.prenom, Table1.date
FROM Table1 LEFT JOIN Table2 ON (Table1.date Table2.date) AND (Table1.prenom = Table2.prenom) AND
(Table1.nom = Table2.nom)
WHERE (((Table2.nom) Is Null));

cela marche effectivement !

ben oui... :o)


mais je ne comprends pas la
clause where (bon je suis pas très expérimenté, tu t'en
étais rendu compte !!) car à priori que l'on teste la
valeur nulle pour Table2.nom ou Table2.prenom ou
Table2.date, le résultat est identique.


En faisant une simple jointure (inner join) sur tous les champs, la requête te renvoie tous les enregistrements égaux.
D'accord ?
Ensuite, tu modifie la jointure pour obtenir tous les enregistrements de la table A (left joint).
Il reste à ajouter le critère qui demande les enregistrements qui n'on pas d'équivalent dans la table B.
Donc, Null comme critère sur *n'importe* quel champ de la table B.

Pour réaliser cela dans la grille de requête, il suffit que tu y glisse les 2 tables.
Crée la relation entre les champs "égaux"
Modifie chaque relation pour avoir "tous les enregistrments de la table A et seulement..."
Glisse la clé primaire de la table A dans la grille et la clé externe de la table B
Comme critère de la clé externe (table B) tu mets Is Null

Ok ?


--
A+
Pierre (3stone) Access MVP
Perso: http://users.skynet.be/accesshome/
Conseils MPFA: http://users.skynet.be/mpfa/
Email : http://www.cerbermail.com/?Xfg61Z3IQw
Avatar
Merci de tes explications et de ta patience ! Mais je
n'aime pas utiliser une réponse sans comprendre.
Maintenant c'est fait !
Merci encore
françois