Se connecter avec
S'enregistrer | Connectez-vous

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:

  1. 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'
  2. 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]
  3. 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:
  1. 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'
  2. 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 :sarcastic: 

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
Expert Programmation

:pfff:  Pauv's codeurs à qui on impose de bosser dans de telles conditions !

  1. SELECT T_OPPO_F.*
  2. INTO T_Cartes_OPPO_contrefait_hors_dossier
  3. IN 'Recherche_POC_donnees_oppo.mdb'
  4. FROM T_OPPO_F
  5. LEFT JOIN T_dossiers_inf_2000 ON T_OPPO_F.N°carte = T_dossiers_inf_2000. N°Carte
  6. LEFT JOIN T_dossiers_entre_2000-et-4000 ON T_OPPO_F.N°carte = T_dossiers_entre_2000-et-4000.N°Carte
  7. LEFT JOIN T_dossiers_entre_4000-et-5000 ON T_OPPO_F.N°carte = T_dossiers_entre_4000-et-5000.N°Carte
  8. ..
  9. WHERE T_dossiers_inf_2000 .N°Carte Is Null
  10. AND T_dossiers_entre_2000-et-4000.N°Carte Is Null
  11. AND T_dossiers_entre_4000-et-5000.N°Carte Is Null
  12. ..


Pour comprendre ton code, je suis obligé de le réécrire. Fais l'effort demandé par mikebzh (Tiens, un breton nouveau :hello:  )
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 :
  1. SELECT * FROM T_dossiers_inf_2000
  2. UNION
  3. SELECT * FROM T_dossiers_entre_2000-et-4000
  4. UNION
  5. SELECT * FROM T_dossiers_entre_4000-et-5000
  6. ..


Le code devient
  1. SELECT T_OPPO_F.*
  2. INTO T_Cartes_OPPO_contrefait_hors_dossier
  3. IN 'Recherche_POC_donnees_oppo.mdb'
  4. FROM T_OPPO_F
  5. LEFT JOIN T_dossiers
  6. ON T_OPPO_F.N°carte = T_dossiers.N°Carte
  7. WHERE T_dossiers.N°Carte Is Null


  1. SELECT T_OPPO_F.*
  2. INTO T_Cartes_OPPO_contrefait_hors_dossier
  3. IN 'Recherche_POC_donnees_oppo.mdb'
  4. FROM T_OPPO_F
  5. INNER JOIN T_dossiers_inf_2000 ON T_OPPO_F.N°carte = T_dossiers_inf_2000. N°Carte
  6. INNER JOIN T_dossiers_entre_2000-et-4000 ON T_OPPO_F.N°carte = T_dossiers_entre_2000-et-4000.N°Carte
  7. INNER JOIN T_dossiers_entre_4000-et-5000 ON T_OPPO_F.N°carte = T_dossiers_entre_4000-et-5000.N°Carte
  8. ..

--> (Pareil) -->
  1. SELECT T_OPPO_F.*
  2. INTO T_Cartes_OPPO_contrefait_hors_dossier
  3. IN 'Recherche_POC_donnees_oppo.mdb'
  4. FROM T_OPPO_F
  5. INNER JOIN T_dossiers
  6. 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 :
  1. SELECT *
  2. ..
  3. FROM T_OPPO_F
  4. 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 :
  1. SELECT *
  2. ..
  3. FROM T_OPPO_F
  4. 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