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
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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));
<corcellef@aol.com> 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 é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));
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
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
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
<anonymous@discussions.microsoft.com> wrote in message
news:187f01c4fa7d$ae3f5a60$a601280a@phx.gbl...
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
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
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 !
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 ??
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 ??
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 ??
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
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
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
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
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
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