IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Access Discussion :

Création de requêtes avec 2 tables non liées


Sujet :

Access

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2007
    Messages : 66
    Points : 47
    Points
    47
    Par défaut Création de requêtes avec 2 tables non liées
    Bonjour,

    Contexte : J’ai 2 tables : TAB1 et TAB2.
    TAB1 possède 15 champs et 43 000 enregistrements environ.
    TAB2 possède 6 champs et 84 000 enregistrements environ.

    ETAPE 1 : Je souhaite effectuer une requête dans Access qui me renvoie tous les enregistrements de TAB1 où : le champ 2 de TAB1 est différent du champ 2 de TAB 2. J’obtiens la requête-table TAB3.

    A partir de cette requête-table (TAB3), je veux avoir tous les enregistrements de TAB3 où : le champ 4 de TAB3 est différent du champ 3 de TAB2. J’obtiens la requête-table TAB4.

    Ca a l’air simple dit comme ça, MAIS mon problème est que j’obtiens des doublons. Je n’ai aucune clé primaire pour pouvoir effectuer la jointure entre les deux premières tables. Je maîtrise le langage SQL mais je n’arrive pas à traduire mon problème à l’aide d’Access et c’est pourtant Access que je dois utiliser.

    Est-ce que quelqu’un pourrait me dire comment traduire l’étape 1, grâce créateur de requêtes d’Access ???

    Merci d’avance pour vos futures pistes…

  2. #2
    Rédacteur/Modérateur
    Avatar de Jeannot45
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2004
    Messages
    3 871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 871
    Points : 8 489
    Points
    8 489
    Par défaut


    As-tu regardé du coté de l'assistant "Requete de non correspondance", sinon .... ?
    Jeannot

    Liens Office indispensables à visiter: Cours (Tutos), F.A.Q., Sources VBA

    Ne posez pas de questions par MP, je n'ai pas le temps d'y répondre

  3. #3
    Membre régulier Avatar de 5GPCISAS1
    Inscrit en
    Novembre 2007
    Messages
    85
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Novembre 2007
    Messages : 85
    Points : 93
    Points
    93
    Par défaut
    Bonjour,

    Je crois qu'il faudrait que tu mettes une clef primaire, et un champ commun dans tes tables pour pouvoir les lier.
    Ensuite tu pourra regarder dans l'assistant "requêtes de non correspondance".

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2007
    Messages : 66
    Points : 47
    Points
    47
    Par défaut
    J'ai des champs communs entre TAB1 ET TAB2, mais je ne peux pas m'en servir comme clefs primaires car les valeurs de ces champs ne sont pas uniques. Ils y a beaucoup de doublons et de valeurs nulles. De plus c'est sur ces champs communs que je souhaite appliquer mes critères de différence.

    Je me demander à tout hasard (car je peux aussi utiliser VBA), s'il est possible de créer des vues en VBA, j'ai essayé ceci mais ça ne fonctionne pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    Public Function Vue_Etiquettes_non_correspondantes()
     
    Dim CnxBasCrt As ADODB.Connection  'Connection sur la Base Courante
    Dim ReqSQL1 As String
     
    Set CnxBasCrt = CurrentProject.Connection 'Ouverture de la base courante
     
    ReqSQL1 = ""
    ReqSQL1 = "CREATE VIEW TAB3 AS SELECT * FROM [TAB1] WHERE [CODE_BARRE] <> (SELECT [Etiquette] FROM [TAB2]);"
     
    DoCmd.SetWarnings False
    DoCmd.RunSQL ReqSQL1
    DoCmd.SetWarnings True
     
    CnxBasCrt.Close
     
    End Function

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2007
    Messages : 66
    Points : 47
    Points
    47
    Par défaut
    J'ai testé avec l'assistant requête de non correspondance et à la fin certaines colonnes sont totalement décalées du genre les dates de la colonne DATE se retrouve dans la colonne NOM, etc... j'ai même des colonnes où il n'y a plus de valeurs ... Bref ça ne marche pas ...

  6. #6
    Membre régulier Avatar de 5GPCISAS1
    Inscrit en
    Novembre 2007
    Messages
    85
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Novembre 2007
    Messages : 85
    Points : 93
    Points
    93
    Par défaut
    Puisque tes tables ne sont pas encore liées, rien ne t'empèches d'y rajouter des champs communs qui te serviront de clef et tu pourra ensuite lier tes tables.
    Je crois que les requêtes de non correspondance fonctionneront beaucoup mieux.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2007
    Messages : 66
    Points : 47
    Points
    47
    Par défaut
    Alors dans TAB2 j'ai ajouté une colonne appelée "REGION", colonne qui apparaît également dans TAB1. Cette colonne prend des valeurs limitées : NORD, EST, OUEST, SUD, CENTRE ou vide.

    Quand j'essaie de lier les tables, j'ai toujours des colonnes décalées ou alors il me fait un produit cartésien et je me retrouve avec une requête-table de 3 millions d'enregistrements...

    Je re-situe le problème, je voudrais obtenir les enregistrements suivants :
    En code SQL ça donne ça (d'après moi) :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Select TAB1.champ1, ..., TAB1.champ15 From TAB1, TAB2
    Where TAB1.REGION = TAB2.REGION
    ANd TAB1.CodeBarre = TAB2.Etiquette ;

    Il me faut donc résoudre ce problème (avant Vendredi) dans Access ou à l'aide de VBA Access éventuellement...

  8. #8
    Membre régulier Avatar de 5GPCISAS1
    Inscrit en
    Novembre 2007
    Messages
    85
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Novembre 2007
    Messages : 85
    Points : 93
    Points
    93
    Par défaut
    Je verrai ta première requête plutôt comme ça;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT TAB1.champ1, TAB1.REGION, ..., TAB1.champ15 FROM TAB1 LEFT JOIN T_TAB2 ON TAB1.REGION = TAB2.REGION
    WHERE (((TAB2.REGION) Is Null));
    Mais ça ne marchera que si tes tables sont liées avec un champ correspondant.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2007
    Messages : 66
    Points : 47
    Points
    47
    Par défaut
    Bonjour !

    J'ai essayé ta requête mais ça ne fonctionne pas quand j'utilise : "LEFT JOIN". J'ai toujours des colonnes décalées et vides
    J'ai pourtant bien créé une liaison entre les deux tables sur le champ REGION.
    Est-ce que le problème ne viendrait pas du fait que même si j'ai un champ commun, je n'ai pas de clé primaire ?

    J'ai alors essayé ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT TAB1.champ1, TAB1.REGION, … TAB1.champ15
    FROM TAB1 INNER JOIN TAB2 ON TAB1.REGION = TAB2.REGION;
    Je pense que ça me fait le produit cartésien, du coup je n'arriverai jamais à extraire mes 200 enregistrements environ (C'est ce que je dvrais obtenir à la fin de toutes mes requêtes).

    Ensuite même en triant avec l'étiquette (qui est mon premier tri !) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT TAB1.champ1, TAB1.REGION, … TAB1.champ15
    FROM TAB1 INNER JOIN TAB2 ON [TAB1].[REGION]=[TAB2].[REGION]
    WHERE ((([TAB1].[CODE_BARRE])<>[TAB2]![ETIQUETTE]));
    J'obtiens encore plus de 1 million d'enregistrements.

    Je commence à désespérer...

    Ah oui, une chose que je n'ai pas compris dans ta requête... Pourquoi choisir :
    WHERE (((TAB2.REGION) Is Null));
    ???

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2007
    Messages : 66
    Points : 47
    Points
    47
    Par défaut
    J'ai à nouveau essayé quelque chose en utilisant NOT IN, NOT EXISTS... dans mes requêtes.

    Tout d'abord j'ai filtré TAB1 pour ne pas avoir de valeurs nulles dans le champ CODE_BARRE. (j'obtiens TAB1bis).
    J'ai effectué la même manipulation pour TAB2 sur le champ ETIQUETTE.

    Ensuite j'ai voulu essayé ça (trouvé dans la FAQ):
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT *
    FROM TAB1bis
    WHERE NOT EXISTS (SELECT NULL FROM TAB2bis WHERE TAB1bis.CODE_BARRE = TAB2bis.ETIQUETTE);

    Mais la requête fait planté Access... ;(

    Ensuite j'ai testé ceci (trouvé aussi dans la FAQ) :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT *
    FROM TAB1bis
    WHERE TAB1bis.CODE_BARRE (NOT) In (SELECT ETIQUETTE FROM TAB2bis);

    J'ai constaté que lorsque je fais avec NOT In ça plante et lorsque je fais avec IN ça marche mais il me faut pourtant le résultat avec NOT IN.
    Je n'ai plus de valeurs nulles dans les champs sur lesquels je requête.

    D'où vient mon problème ???

    Merci de votre patience !

  11. #11
    Membre régulier Avatar de 5GPCISAS1
    Inscrit en
    Novembre 2007
    Messages
    85
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Novembre 2007
    Messages : 85
    Points : 93
    Points
    93
    Par défaut
    Rajoute une clef primaire dans tes tables et essaies avec le générateur de requêtes de non-correspondance, vois ce que ça donne et regardes la vue SQL.
    Tu devrais avoir une bonne structure de code.

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2007
    Messages : 66
    Points : 47
    Points
    47
    Par défaut
    Je pense en effet qu'avec une clef primaire ça devrait me faciliter la tâche.
    MAIS, admettons que je crée une clef primaire dans TAB1 que j'appelle Num1 et qui associe pour chaque enregistrement un numéro distinct. Pour TAB1, ça donnerai une liste de valeur de 1 à 43 000 (puisque ma table contient 43 000 enregistrements).

    Je fais la même chose pour TAB2 en créant un champ Num2 qui prendra ses valeurs entre 1 et 84 000 (puique TAB2 contient 84 000 enregistrements).

    Lorsque je ferais la jointure, la requête comparera uniquement les étiquettes de TAB1 et TAB2 pour lequel TAB1.Num1 = TAB2.Num2.
    Or j'aurais surement des enregistrements pour lesquels l'étiquette de TAB1 existerait dans TAB2, mais pas pour le même numéro de clef primaire.
    (Je dois trouver toutes les étiquettes de TAB1 qui n'existent pas dans TAB2 !)

    Ca m'embête donc de créer des clefs primaires "factices", car je pense que cela faussera mes résultats...

  13. #13
    Membre régulier Avatar de 5GPCISAS1
    Inscrit en
    Novembre 2007
    Messages
    85
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Novembre 2007
    Messages : 85
    Points : 93
    Points
    93
    Par défaut
    Tu ne dois pas baser ta requête sur les clefs primaires; elles ne sont là que pour faciliter la recherche.
    Tu dois la baser sur des champs communs.

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2007
    Messages : 66
    Points : 47
    Points
    47
    Par défaut
    Dans ce cas, je ne suis pas sûre de l'utilité de créer des clefs primaires !?!

    Si je comprends bien ce que tu me dis, je dois :
    - créer une clef primaire dans chacune des tables.
    - faire le lien entre mes tables par un champ commun (ici REGION).
    - faire une première requête qui me récupère les étiquettes de la première table, qui n'apparaissent pas dans la deuxième table.
    - faire une deuxième requête, en partant de la première requête, qui me récupère tous les numéros de série qui n'apparaissent dans la deuxième table.

    A quel moment est-ce que je me sers des clefs primaires ?
    (Désolé de te faire te répêter...)

  15. #15
    Membre régulier Avatar de 5GPCISAS1
    Inscrit en
    Novembre 2007
    Messages
    85
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Novembre 2007
    Messages : 85
    Points : 93
    Points
    93
    Par défaut
    Les clefs primaires servent pour les liens de tes tables.

    Exemple: TAB1.REGION (clef primaire) lié (un à plusieurs) avec TAB2.REGION (pas clef primaire, mais champ commun)
    Et TAB2.Num2 (clef primaire) lié (un à plusieurs) avec TAB3.Num2 (pas clef primaire, mais champ commun)
    La clef primaire peux être un numéro automatique,un nombre ou même du texte mais le champ correspondant doit avoir la même structure (!!! pour les nombres; entier long).

    Tu peux faire une requête de non correspondance des enregistrements TAB1.REGION et TAB2.REGION
    (elle te donnera les enregistrements REGION qui sont dans TAB1 et pas dans TAB2.

  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2007
    Messages : 66
    Points : 47
    Points
    47
    Par défaut
    Je pense avoir trouvé !
    Pour ma première requête, je fais ça :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT *
    FROM TAB1 LEFT JOIN TAB2 ON TAB1.CODE_BARRE = TAB2.ETIQUETTE
    WHERE (((TAB2.ETIQUETTE) Is Null));
    J'obtiens alors TAB3 !

    Pour ma deuxième requête, je fais ça :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT *
    FROM TAB3 LEFT JOIN TAB2 ON TAB3.NSERIE_BIOS = TAB2.NSERIE_BIEN
    WHERE (((TAB2.NSERIE_BIEN) Is Null));

    J'obtiens alors TAB4 !

    Pour ma deuxième requête, je fais ça :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT *
    FROM TAB4 LEFT JOIN TAB2 ON TAB4.NSERIE_VAR = TAB2.NSERIE_BIEN
    WHERE (((TAB2.NSERIE_BIEN) Is Null));

    J'obtiens alors TAB5 ! Dans cette requête-table, j'obtiens certains enregistrements qui sont décalés. Pour terminer je filtre donc sur ma clef primaire : CLE_CIM.
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT *
    FROM TAB5
    WHERE (((TAB5.CLE_CIM) Is Not Null));

    J'obtiens alors mes enregistrements finaux dans TAB6 !
    J'ai encore du boulot car je dois extraire les enregistrements de TAB6 vers Excel... Mais ça, je sais le faire

    Merci encore pour ton aide. A bientôt ^^

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Toutes versions] Création de requêtes avec un nom de table variable
    Par l.flipper dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 15/02/2015, 11h31
  2. [AC-2003] Requête concernant 2 Tables non liées
    Par gentoo dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 13/03/2011, 18h53
  3. [AC-2007] Ouvrir la création de requête avec une table sélectionnée
    Par zoom61 dans le forum VBA Access
    Réponses: 2
    Dernier message: 23/03/2010, 14h30
  4. [AC-2003] Requête égalité entre deux tables non liées.
    Par Thotho-Maxime dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 28/07/2009, 09h14
  5. [CR9] Pb de tables non liées
    Par vhc dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 15/04/2004, 10h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo