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

Langage SQL Discussion :

Jointure qui ne renvoie pas tous les enregistrements


Sujet :

Langage SQL

  1. #1
    Futur Membre du Club
    Inscrit en
    Août 2002
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 4
    Par défaut Jointure qui ne renvoie pas tous les enregistrements
    une requete ne renvoit pas d'enregistrements si une des tables de Select est vide?
    je suis entrain de devenir fou !!!

    si j'execute

    SELECT a.Prénom, l.Titre , ab.ville
    FROM livre AS l, auteur AS a, adressbibli AS ab
    WHERE l.numa=a.numa And ab.numab=l.numab And a.nom = [tapez le nom de l'auteur];

    selon le MLD

    auteur(numa, prénom)
    livre(numl, titre, numa#, numab#)
    adressbibli(numab, ville)

    -la requete ne me renvois aucun enregistrements si je ne rentre aucune valeur dans adressbibli.ville

    -D'une manière générale est-il normal que les requetes ne renvois rien du tout si une des tables de Select est vide ???

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Août 2002
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2002
    Messages : 24
    Par défaut
    Dans l'hypothèse ou c'est ab qui est vide

    SELECT a.Prénom, l.Titre , ab.ville
    FROM (a INNER JOIN l ON a.numa = l.numa) LEFT JOIN ab ON ab.numab = l.numab
    WHERE a.nom = ' ';

    dans l'hypothèse ou c'est a

    SELECT a.Prénom, l.Titre , ab.ville
    FROM (l INNER JOIN ab ON ab.numa = l.numab) LEFT JOIN a ON a.numa = l.numa
    WHERE a.nom = ' ';

    dans l'hypothèse ou c'est l, vu qu'elle fait la liaison entre ab et a, là t'auras rien c'est clair, bien que tu puisse toujours faire un CROSS JOIN.

    Attention quand même aux différence entre = et LIKE

  3. #3
    Membre émérite

    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 40
    Par défaut
    L'utilisation du LEFT ou du RIGHT JOIN te permet de récupérer un flux de données en sortie même s'il n'existe pas de correspondance dans l'une des tables satellites.

    Voici de la documentation MS complémentaire sur les jointures

    Utilisation des jointures :
    Les conditions de jointure peuvent être spécifiées dans les clauses FROM ou WHERE, mais il est recommandé de le faire dans les clauses FROM. Les clauses WHERE et HAVING peuvent également contenir des conditions de recherche afin de filtrer par la suite les lignes sélectionnées par les conditions de jointure.

    Les jointures peuvent être classées en catégories de la manière suivante :

    Jointures internes (opération de jointure typique qui utilise certains opérateurs de comparaison tels que = ou <>). Ces jointures comprennent les équi-jointures et les jointures naturelles.
    Les jointures internes utilisent un opérateur de comparaison afin de faire correspondre les lignes de deux tables basées sur des valeurs dans les colonnes communes de chaque table. Par exemple, l'extraction de toutes les lignes dont le numéro d'identification des étudiants est identique dans les tables students et courses.

    Jointures externes. Les jointures externes peuvent être des jointures externes gauche, droite ou complète.
    Les jointures externes sont spécifiées à l'aide d'un des ensembles de mots clés suivants lorsqu'ils sont spécifiés dans la clause FROM :

    LEFT JOIN ou LEFT OUTER JOIN
    Le jeu de résultats d'une jointure externe gauche comprend toutes les lignes de la table gauche spécifiée dans la clause LEFT OUTER et pas uniquement celles qui correspondent dans les colonnes jointes. Lorsqu'une ligne de la table gauche n'a pas de correspondant dans la table de droite, la ligne du jeu de résultats associée comprend des valeurs NULL pour toutes les colonnes de la liste de sélection provenant de la table droite.

    RIGHT JOIN ou RIGHT OUTER JOIN
    Une jointure externe droite est le contraire de la jointure externe gauche. Toutes les lignes de la table de droite sont renvoyées. Des valeurs NULL sont renvoyées pour la table de gauche chaque fois qu'une ligne de la table de droite n'a pas de ligne correspondante dans la table de gauche.

    FULL JOIN ou FULL OUTER JOIN
    Une jointure externe complète renvoie toutes les lignes des tables de gauche et de droite. Chaque fois qu'une ligne n'a pas de correspondance dans une autre table, les colonnes de la liste de sélection de l'autre table comportent des valeurs NULL. Lorsqu'il existe une correspondance entre les tables, la ligne de tout le jeu de résultats contient des valeurs de données des tables de base.

    Jointures croisées
    Les jointures croisées renvoient toutes les lignes de la table de gauche, chaque ligne de celle-ci étant combinée à toutes les lignes de la table de droite. Les jointures croisées sont également appelées produits cartésiens.

    L'exemple illustre une jointure interne qui extrait les auteurs habitant le même État et la même ville qu'un éditeur :

    USE pubs

    SELECT a.au_fname, a.au_lname, p.pub_name

    FROM authors AS a INNER JOIN publishers AS p

    ON a.city = p.city

    AND a.state = p.state

    ORDER BY a.au_lname ASC, a.au_fname ASC



    Les tables ou vues de la clause FROM peuvent être spécifiées dans n'importe quel ordre pour les jointures internes ou externes complètes. En revanche, l'ordre est pertinent dans le cas des jointures externes gauche ou droite. Pour plus d'informations sur l'ordre des tables dans les jointures externes gauche ou droite, voir ‹« Utilisation de jointures externes » dans ce volume.›Utilisation de jointures externes.

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 997
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 997
    Billets dans le blog
    6
    Par défaut
    La syntaxe SQL normalisée depouis 1992 (10 ans) veut que l'on utilise des clauses de jointure pour joindre les tables.

    Lire à ce propos, sur mon site SQLpro :
    http://membres.lycos.fr/sqlpro/SQL_AZ_3.html#JOIN_syntaxe

    SELECT a.Prénom, l.Titre , ab.ville
    FROM livre l
    INNER JOIN auteur a
    ON l.numa=a.numa
    INNER JOIN adressbibli ab
    ON ab.numab=l.numab
    WHERE a.nom = [tapez le nom de l'auteur]

    Si l'adresse n'existe pas, il n'y a donc pas jointure.
    Dans ce cas il faut utiliser une jointure externe :

    SELECT a.Prénom, l.Titre , ab.ville
    FROM livre l
    INNER JOIN auteur a
    ON l.numa=a.numa
    LEFT OUTER adressbibli ab
    ON ab.numab=l.numab
    WHERE a.nom = [tapez le nom de l'auteur]

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  5. #5
    Futur Membre du Club
    Inscrit en
    Août 2002
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 4
    Par défaut
    houla merci beaucoup de votre aide !!! je bois un café je me réveille un peu mieux et je me plonge dans vos explications...

  6. #6
    Futur Membre du Club
    Inscrit en
    Août 2002
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 4
    Par défaut
    si j'utilise la requete de senke ça marche :

    SELECT a.Prénom, l.Titre, ab.ville
    FROM (auteur AS a INNER JOIN livre AS l ON a.numa = l.numa) LEFT Join adressbibli AS ab ON ab.numab = l.numab
    WHERE a.nom = [tapez le nom de l'auteur];

    mais si j'utilise :

    SELECT a.Prénom, l.Titre , ab.ville
    FROM livre l
    INNER JOIN auteur a
    ON l.numa=a.numa
    LEFT OUTER adressbibli ab
    ON ab.numab=l.numab
    WHERE a.nom = [tapez le nom de l'auteur];

    access 2000 me renvoit l'erreur suivante : "erreur de syntaxe (opérateur absent) dans l'expression "l.numa=a.numa LEFT OUTER adressbibli ab ON ab.numab=l.numab"

    pourquoi ?

  7. #7
    Membre émérite
    Avatar de Gandalf24
    Homme Profil pro
    Integrateur Odoo
    Inscrit en
    Mai 2002
    Messages
    481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Integrateur Odoo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 481
    Par défaut
    Hug

    En fait, il me semble que access ne gère pas le ... D'ou ton pb...

  8. #8
    Futur Membre du Club
    Inscrit en
    Août 2002
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 4
    Par défaut
    access commence vraiment à me gaver sérieusement...

    Sql pro, ton site est probablement ce que j'ai vu de mieux dans le genre !!! bravo et surtout merci...

  9. #9
    Membre actif
    Homme Profil pro
    retraité
    Inscrit en
    Juillet 2024
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2024
    Messages : 15
    Par défaut jean-jacques
    il faut utiliser la jointure externe (+)

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT a.Prénom, l.Titre , ab.ville
    FROM livre AS l, auteur AS a, adressbibli AS ab
    WHERE l.numa=a.numa(+) And ab.numab(+)=l.numab And a.nom = [tapez le nom de l'auteur];

  10. #10
    Membre Expert
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 172
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 172
    Par défaut
    Hmm, déterrer un sujet vieux de 22 ans, pas sûr que ce soit utile

  11. #11
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 599
    Billets dans le blog
    10
    Par défaut
    Non seulement c'est un déterrage de première classe, mais en plus...

    Citation Envoyé par LEGALLJJA Voir le message
    il faut utliser la jointure externe (+)

    SELECT a.Prénom, l.Titre , ab.ville
    FROM livre AS l, auteur AS a, adressbibli AS ab
    WHERE l.numa=a.numa(+) And ab.numab(+)=l.numab And a.nom = [tapez le nom de l'auteur];
    ... il y a belle lurette que les jointures externes ne s'écrivent plus sous cette forme, mais avec l'opérateur JOIN...

  12. #12
    Membre actif
    Homme Profil pro
    retraité
    Inscrit en
    Juillet 2024
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2024
    Messages : 15
    Par défaut
    bonjour,

    excusez moi j'ai l'habitude de faire les jointures à l'ancienne

    voila le code modifié selon votre conseil. je pense que c'est bon.

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT auteur.Prénom
         , livre.Titre
         , adressbibli.ville
    FROM livre
    LEFT JOIN auteur
      ON livre.numa=auteur.numa
    LEFT JOIN adressbibli
      ON livre.numab=adressbibli.numab
    WHERE livre.nom = [tapez le nom de l'auteur];

    cordialement

  13. #13
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 599
    Billets dans le blog
    10
    Par défaut
    C'est mieux, mais :

    • la colonne "Prénom" comporte un caractère accentué, il faut donc délimiter la colonne avec des doubles quotes (SQL normalisé) ou des quotes inversées (MySQL/MariaDB)
      (d'une façon générale, on évite les caractères spéciaux et les noms réservés SQL pour éviter ce genre de désagréments) ;
    • plutôt que de nommer les tables in extenso, il est plus pratique d'utiliser des alias de tables ;
    • "tapez le nom de l'auteur" n'est évidemment pas une possibilité dynamique, il faut alimenter une host variable qui sera utilisée dans la requête.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 01/03/2011, 12h00
  2. GlassPane qui ne recouvre pas tous les composants ?
    Par Lamarios dans le forum AWT/Swing
    Réponses: 6
    Dernier message: 24/03/2010, 05h34
  3. [AC-2003] Mon état n'affiche pas tous les enregistrements
    Par yael44 dans le forum IHM
    Réponses: 1
    Dernier message: 01/11/2009, 20h04
  4. Réponses: 3
    Dernier message: 18/11/2008, 15h31
  5. [MySQL] Requete en Php: Ne lit pas tous les enregistrements d'une table
    Par smooncef dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 08/08/2008, 10h16

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