Détection de numéro dans un autre table
Dernière réponse : dans Programmation
Bonjour,
Donc voici mon problème j'ai une liste de numéro et je voudrais identifier les numéros qui ne sont dans aucun des dossier (tables)
donc j'ai fait le code suivant:
Et il m'affiche trois numéro sur 200000 a peu près
Or il s'avere que lorsque je veux effectuer l'inverse c'est a dire detecter les cartes qui sont daunt un dossier voir plusieur
j''ai exécuter ce code:
et il ne m'affiche rien alors je ne sais pas d'ou vien l'erreur.
Si quelqu'un peut m'aider
Merci d'avance;
Je tiens à préciser que c'est sous Access et que les dossiers sur plusieur tables et les nom de champs ne sont pas de moi (mais j'ai pas le choix je dois faire avec je sais c'est crade mais bon...)
Donc voici mon problème j'ai une liste de numéro et je voudrais identifier les numéros qui ne sont dans aucun des dossier (tables)
donc j'ai fait le code suivant:
SELECT T_OPPO_F.* INTO T_Cartes_OPPO_contrefait_hors_dossier IN '\\Soleil\etudes_et_prévention_des_risques\outils_LCLF_access\Donnees Recherche POC\Recherche_POC_donnees_oppo.mdb' FROM ((((((((T_OPPO_F LEFT JOIN T_dossiers_inf_2000 ON T_OPPO_F.[N° de carte] = T_dossiers_inf_2000.[N° Carte]) LEFT JOIN [T_dossiers_entre_2000-et-4000] ON T_OPPO_F.[N° de carte] = [T_dossiers_entre_2000-et-4000].[N° Carte]) LEFT JOIN [T_dossiers_entre_4000-et-5000] ON T_OPPO_F.[N° de carte] = [T_dossiers_entre_4000-et-5000].[N° Carte]) LEFT JOIN [T_dossiers_entre_5000-et-5300] ON T_OPPO_F.[N° de carte] = [T_dossiers_entre_5000-et-5300].[N° Carte]) LEFT JOIN [T_dossiers_entre_5300-et-5600] ON T_OPPO_F.[N° de carte] = [T_dossiers_entre_5300-et-5600].[N° Carte]) LEFT JOIN [T_dossiers_entre_6500-et-7100] ON T_OPPO_F.[N° de carte] = [T_dossiers_entre_6500-et-7100].[N° Carte]) LEFT JOIN [T_dossiers_entre_5600-et-5900] ON T_OPPO_F.[N° de carte] = [T_dossiers_entre_5600-et-5900].[N° Carte]) LEFT JOIN [T_dossiers_entre_5900-et_6000] ON T_OPPO_F.[N° de carte] = [T_dossiers_entre_5900-et_6000].[N° Carte]) LEFT JOIN [T_dossiers_entre_6000-et_6500] ON T_OPPO_F.[N° de carte] = [T_dossiers_entre_6000-et_6500].[N° Carte] WHERE (((T_dossiers_inf_2000.[N° Carte]) Is Null) AND (([T_dossiers_entre_2000-et-4000].[N° Carte]) Is Null) AND (([T_dossiers_entre_4000-et-5000].[N° Carte]) Is Null) AND (([T_dossiers_entre_5000-et-5300].[N° Carte]) Is Null) AND (([T_dossiers_entre_5300-et-5600].[N° Carte]) Is Null) AND (([T_dossiers_entre_5900-et_6000].[N° Carte]) Is Null) AND (([T_dossiers_entre_6000-et_6500].[N° Carte]) Is Null) AND (([T_dossiers_entre_6500-et-7100].[N° Carte]) Is Null));
Et il m'affiche trois numéro sur 200000 a peu près
Or il s'avere que lorsque je veux effectuer l'inverse c'est a dire detecter les cartes qui sont daunt un dossier voir plusieur
j''ai exécuter ce code:
SELECT T_OPPO_F.* INTO T_Cartes_OPPO_contrefait_hors_dossier IN '\\Soleil\etudes_et_prévention_des_risques\outils_LCLF_access\Donnees Recherche POC\Recherche_POC_donnees_oppo.mdb' FROM ((((((((T_OPPO_F INNER JOIN T_dossiers_inf_2000 ON T_OPPO_F.[N° de carte] = T_dossiers_inf_2000.[N° Carte]) INNER JOIN [T_dossiers_entre_2000-et-4000] ON T_OPPO_F.[N° de carte] = [T_dossiers_entre_2000-et-4000].[N° Carte]) INNER JOIN [T_dossiers_entre_4000-et-5000] ON T_OPPO_F.[N° de carte] = [T_dossiers_entre_4000-et-5000].[N° Carte]) INNER JOIN [T_dossiers_entre_5000-et-5300] ON T_OPPO_F.[N° de carte] = [T_dossiers_entre_5000-et-5300].[N° Carte]) INNER JOIN [T_dossiers_entre_5300-et-5600] ON T_OPPO_F.[N° de carte] = [T_dossiers_entre_5300-et-5600].[N° Carte]) INNER JOIN [T_dossiers_entre_6500-et-7100] ON T_OPPO_F.[N° de carte] = [T_dossiers_entre_6500-et-7100].[N° Carte]) INNER JOIN [T_dossiers_entre_5600-et-5900] ON T_OPPO_F.[N° de carte] = [T_dossiers_entre_5600-et-5900].[N° Carte]) INNER JOIN [T_dossiers_entre_5900-et_6000] ON T_OPPO_F.[N° de carte] = [T_dossiers_entre_5900-et_6000].[N° Carte]) INNER JOIN [T_dossiers_entre_6000-et_6500] ON T_OPPO_F.[N° de carte] = [T_dossiers_entre_6000-et_6500].[N° Carte];
et il ne m'affiche rien alors je ne sais pas d'ou vien l'erreur.
Si quelqu'un peut m'aider
Merci d'avance;
Je tiens à préciser que c'est sous Access et que les dossiers sur plusieur tables et les nom de champs ne sont pas de moi (mais j'ai pas le choix je dois faire avec je sais c'est crade mais bon...)
Autres pages sur : detection numero table
Lassé par la pub ? Créez un compte
Ton code est franchement illisible mais bon
Regarde du coté des tes différentes clés primaires et étrangères car les fonctions LEFT et INNER ne travaillent pas pareilles
LEFT JOIN
Selectionne les enregs de deux tables jointes en affichant pour la table de gauche (clé primaire) touos les enregs même s'ils n'ont pas de correspondance à droite (clé étrangère).
INNER JOIN
Selectionne les enregs de deux tables jointes en n'affichant que les enregs qui ont une correspondance (primaire & étrangère).
--> c'est peut-être pour cela que tu ne recuperes aucun résultat, mais bon si tu veux de l'aide essaie de nous faire un croquis des diffférentes tables avec seulement les clés et leurs cardinalités parce que là vraiment
Conseil, tu peux déjà alléger ta requete pour le forum en allegeant les noms, met par exemple T20-40, T59-60, ... au lieu de T_dossiers_entre_2000-et-4000, T_dossiers_entre_5900-et_6000, ... idem pour les champs , tu feras les modifs après.
Cela ferait peut-être moins mal au yeux
Salut
Regarde du coté des tes différentes clés primaires et étrangères car les fonctions LEFT et INNER ne travaillent pas pareilles
LEFT JOIN
Selectionne les enregs de deux tables jointes en affichant pour la table de gauche (clé primaire) touos les enregs même s'ils n'ont pas de correspondance à droite (clé étrangère).
INNER JOIN
Selectionne les enregs de deux tables jointes en n'affichant que les enregs qui ont une correspondance (primaire & étrangère).
--> c'est peut-être pour cela que tu ne recuperes aucun résultat, mais bon si tu veux de l'aide essaie de nous faire un croquis des diffférentes tables avec seulement les clés et leurs cardinalités parce que là vraiment
Conseil, tu peux déjà alléger ta requete pour le forum en allegeant les noms, met par exemple T20-40, T59-60, ... au lieu de T_dossiers_entre_2000-et-4000, T_dossiers_entre_5900-et_6000, ... idem pour les champs , tu feras les modifs après.
Cela ferait peut-être moins mal au yeux
Salut
Pauv's codeurs à qui on impose de bosser dans de telles conditions !
SELECT T_OPPO_F.* INTO T_Cartes_OPPO_contrefait_hors_dossier IN 'Recherche_POC_donnees_oppo.mdb' FROM T_OPPO_F LEFT JOIN T_dossiers_inf_2000 ON T_OPPO_F.N°carte = T_dossiers_inf_2000. N°Carte LEFT JOIN T_dossiers_entre_2000-et-4000 ON T_OPPO_F.N°carte = T_dossiers_entre_2000-et-4000.N°Carte LEFT JOIN T_dossiers_entre_4000-et-5000 ON T_OPPO_F.N°carte = T_dossiers_entre_4000-et-5000.N°Carte .. WHERE T_dossiers_inf_2000 .N°Carte Is Null AND T_dossiers_entre_2000-et-4000.N°Carte Is Null AND T_dossiers_entre_4000-et-5000.N°Carte Is Null ..
Pour comprendre ton code, je suis obligé de le réécrire. Fais l'effort demandé par mikebzh (Tiens, un breton nouveau
)Et j'ose te le redire, la séparation des dossiers dans des tables différentes, c'est nul, archi-nul.
(Je sais, tu y es obligé, mais puique ton code sera lu par d'autres, je me dois de le re-signaler).
Par contre, je ne vois pas bien le coup des jointures sur des champs nuls.
Je répète : "Utilise une seule table T_dossiers".
Si tu n'as pas le droit de la créer, fais une requête que tu enregistres et que tu appelles T_dossiers :
SELECT * FROM T_dossiers_inf_2000 UNION SELECT * FROM T_dossiers_entre_2000-et-4000 UNION SELECT * FROM T_dossiers_entre_4000-et-5000 ..
Le code devient
SELECT T_OPPO_F.* INTO T_Cartes_OPPO_contrefait_hors_dossier IN 'Recherche_POC_donnees_oppo.mdb' FROM T_OPPO_F LEFT JOIN T_dossiers ON T_OPPO_F.N°carte = T_dossiers.N°Carte WHERE T_dossiers.N°Carte Is Null
SELECT T_OPPO_F.* INTO T_Cartes_OPPO_contrefait_hors_dossier IN 'Recherche_POC_donnees_oppo.mdb' FROM T_OPPO_F INNER JOIN T_dossiers_inf_2000 ON T_OPPO_F.N°carte = T_dossiers_inf_2000. N°Carte INNER JOIN T_dossiers_entre_2000-et-4000 ON T_OPPO_F.N°carte = T_dossiers_entre_2000-et-4000.N°Carte INNER JOIN T_dossiers_entre_4000-et-5000 ON T_OPPO_F.N°carte = T_dossiers_entre_4000-et-5000.N°Carte ..
--> (Pareil) -->
SELECT T_OPPO_F.* INTO T_Cartes_OPPO_contrefait_hors_dossier IN 'Recherche_POC_donnees_oppo.mdb' FROM T_OPPO_F INNER JOIN T_dossiers ON T_OPPO_F.N°carte = T_dossiers.N°Carte
_____________________________________________________________
Pour voir si un truc existe ailleurs, la syntaxe suivante me paraît plus judicieuse :
SELECT * .. FROM T_OPPO_F WHERE EXISTS ( SELECT * FROM T_dossiers WHERE N°carte = T_OPPO_F.N°Carte )
C'est quand même plus clair.
D'ailleurs, ta requête pour trouver ce qui n'existe pas pourrait devenir :
SELECT * .. FROM T_OPPO_F WHERE NOT EXISTS ( SELECT * FROM T_dossiers WHERE N°carte = T_OPPO_F.N°Carte )
Qu'en penses-tu ?
Lassé par la pub ? Créez un compte