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

Requêtes et SQL. Discussion :

Left join avec une condition dans l'autre table


Sujet :

Requêtes et SQL.

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2009
    Messages : 95
    Points : 58
    Points
    58
    Par défaut Left join avec une condition dans l'autre table
    Bonjour,

    J’ai deux tables très simple A et B
    A contient un matricule, nom et prénom.

    A est organisé comme suit :
    Matricule nom prenom
    1 Dubois Albert
    2 Martin Julie
    Etc.

    B contient matricule, nature et valeur
    B est organisé de cette manière:

    Matricule nature valeur
    1 TEL 025001234
    1 ADR Rue tartine
    1 NUM 1
    1 CODEPOS 1000
    1 LOC Bruxelles
    2 TEL 025004321
    Etc.

    Je dois obtenir tous les noms, prénoms et téléphone même ceux qui n’ont pas de téléphone

    J’ai essayé ceci :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT *
    FROM A LEFT JOIN B ON A.matricule=B.matricule AND B.nature= "TEL" ;
    Mais j’ai une erreur. Pourtant cette syntaxe fonctionne avec un autre SGBD.

    Je pourrais passer par une requête supplémentaire, mais je veux éviter ça.

    J’ai tenté ceci :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT *
    FROM A LEFT JOIN B ON A.matricule=B.matricule 
    WHERE  B.nature= "TEL" ;
    Mais dans ce cas, je perds les personnes qui n’ont pas de téléphone.
    Si quelqu’un a une idée, je suis preneur.

    Merci

  2. #2
    Membre expérimenté
    Avatar de minot83
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mars 2006
    Messages
    972
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2006
    Messages : 972
    Points : 1 430
    Points
    1 430
    Par défaut
    Bonjour,

    je ne pense pas que tu puisses y parvenir comme ceci.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT A.Matricule, A.nom, A.prenom, B.nature, B.valeur
    FROM A LEFT JOIN B ON A.Matricule = B.Matricule_B
    WHERE (((B.nature)="tel"));
    Cette requête n'affiche que les personnes dont la nature "tel" a été renseignée.
    Sinon, il faut que par défaut, dans ta table B, une nature "tel" existe, même avec une valeur vide.

    pourquoi une telle structure?
    Pourquoi ne pas créer les champs tel, adresse, etc dans la table A? c'est sa vocation pourtant....

    Cordialement
    si le message est pertinent : un petit si votre problème est résolu, n'oubliez pas le Tag Merci

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2009
    Messages : 95
    Points : 58
    Points
    58
    Par défaut
    Ben oui, ça ne fonctionne pas.

    Sinon, ce n'est pas moi qui ai analysé ni fabriqué cette structure, je ne peux qu'y accéder.

    De nouveau, la requête:

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT *
    FROM A left outer join B on A.matricule=B.matricule AND B.nature = 'TELEPH'
    Fonctionne parfaitement (avec sybase).

    Mais pour obtenir le même résultat avec Access, j'ai pas encore trouvé.

    Merci

  4. #4
    Expert confirmé Avatar de Richard_35
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    3 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 3 121
    Points : 4 596
    Points
    4 596
    Par défaut
    Bonjour Rj450 et Minot83,

    Un contournement (via l'assistant) :
    • une première requête R1 qui analyse B (FROM), uniquement les "TEL" (WHERE) ;
    • une seconde requête R2 qui analyse A liée à R1 (FROM) avec flèche à droite (LEFT JOIN).

    Tu devrais obtenir le résultat souhaité.
    Dis-nous et à bientôt,
    Richard.
    ----------------------------------------------------------------------------------------------
    En cas de résolution, et afin de faciliter la tâche des bénévoles, merci de cliquer sur .
    et permettent aux forumeurs de cibler leur recherche dans une discussion : n'hésitez pas à voter !

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2009
    Messages : 95
    Points : 58
    Points
    58
    Par défaut
    Merci Richard_35,

    Effectivement, j'avais déjà trouvé cette solution.

    Mais je préfèrerai quelque chose de plus élégant en une seule requête.

    Merci.

  6. #6
    Expert confirmé Avatar de Richard_35
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    3 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 3 121
    Points : 4 596
    Points
    4 596
    Par défaut
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT *
    FROM A LEFT JOIN B ON (A.matricule=B.matricule AND B.nature= "TEL") ;
    ==> devrait fonctionner (ajout des paranthèses).
    Dis-nous et à bientôt,
    Richard.
    ----------------------------------------------------------------------------------------------
    En cas de résolution, et afin de faciliter la tâche des bénévoles, merci de cliquer sur .
    et permettent aux forumeurs de cibler leur recherche dans une discussion : n'hésitez pas à voter !

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2009
    Messages : 95
    Points : 58
    Points
    58
    Par défaut
    Encore merci Richard_35,

    Access génère une erreur : "Expression JOIN non supportée".

    On n'y est pas encore.

    Mais on avance...

  8. #8
    Expert confirmé Avatar de Richard_35
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    3 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 3 121
    Points : 4 596
    Points
    4 596
    Par défaut
    Hum... sous Access 2010, je viens de la lancer telle quelle (sans les parenthèses), et elle fonctionne (copier/coller) :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT Nom.id, Nom.nom, Nature.nature, Nature.valeur
    FROM Nom LEFT JOIN Nature ON Nom.id = Nature.id and nature.nature="TEL";
    Essaies de la créer de toute pièce, sans modifier une requête existante.
    Dis-nous et à bientôt,
    Richard.
    ----------------------------------------------------------------------------------------------
    En cas de résolution, et afin de faciliter la tâche des bénévoles, merci de cliquer sur .
    et permettent aux forumeurs de cibler leur recherche dans une discussion : n'hésitez pas à voter !

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2009
    Messages : 95
    Points : 58
    Points
    58
    Par défaut
    OK,

    Je teste ça lundi et je reviens.

    Merci

Discussions similaires

  1. [XL-2010] en vba copier coller avec une condition dans des classeurs différents
    Par will83177 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 26/02/2014, 17h38
  2. Réponses: 3
    Dernier message: 23/11/2010, 13h53
  3. Probleme avec une condition dans une macro
    Par majudis dans le forum IHM
    Réponses: 1
    Dernier message: 08/10/2010, 16h29
  4. requete sql avec une condition dans une zone de liste
    Par khilim1 dans le forum VBA Access
    Réponses: 2
    Dernier message: 30/12/2008, 12h00
  5. Comment regrouper avec une condition dans une requête
    Par moilou2 dans le forum Requêtes et SQL.
    Réponses: 7
    Dernier message: 22/07/2008, 10h39

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