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 :

[débutant] 1 ordre select sur une OU plusieurs tables


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Inscrit en
    Mars 2005
    Messages
    78
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 78
    Points : 51
    Points
    51
    Par défaut [débutant] 1 ordre select sur une OU plusieurs tables
    Je pense que j vais poser une question très con, mais je galère et je n'arrive à rien.
    Voilà, j'aimerais effectuer un select sur plusieurs tables.

    Dans ma table principale, j'ai des clés étrangères pour accèder aux autres tables, mais toutes les lignes n'ont pas forcément une valeur qui leur correspond dans les tables filles (les champs de clé étrangère peuvent être null)
    Lorsque je fais mon ordre select avec une simple jointure, le resultat ne me renvoie que les lignes qui ont toutes les clé étrangères de renseignées alors que j'aimerais avoir toutes les lignes de la table principale, et pour les ligne dont les clés sont renseignées, les valeurs qui leur correspondent.
    J'éspère m'être fait comprendre.

    Voilà un exemple simplifié au maximum:

    table Client : Nom_client, ID_commune
    table commune : ID_commune, nom_commune, code_postal
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select client.nom_client, commune.code_postal, commune.nom_commune
    from client, commune
    where client.id_commune=commune.id_commune
    Ne me renverrait que les client dont le champs ID_commune est renseigné.

    Mon ordre select a beaucoup plus de champs et est sur 7 tables(minimum), mais déjà ça, j'y arrive pas !

  2. #2
    BiM
    BiM est déconnecté
    Expert éminent sénior
    Avatar de BiM
    Femme Profil pro
    Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT
    Inscrit en
    Janvier 2005
    Messages
    7 796
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT

    Informations forums :
    Inscription : Janvier 2005
    Messages : 7 796
    Points : 10 765
    Points
    10 765
    Par défaut
    Fais un UNION de plusieurs requêtes.

    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
    18
        (SELECT
            Client.NomClient,
            Commune.Code_Postal,
            Commune.Nom_Commune
        FROM
            Client,
            Commune
        WHERE
            Client.Id_Commune=Commune.Id_Commune)
    UNION
        (SELECT
            Client.NomClient,
            NULL,
            NULL
        FROM
            Client
        WHERE
            Client.Id_Commune=NULL)

  3. #3
    Membre habitué Avatar de Original Prankster
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    226
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juillet 2005
    Messages : 226
    Points : 192
    Points
    192
    Par défaut
    Salut,

    Je me suis heurté au même problème que toi. Je faisais une équijointure, ce qui faisait en sorte que les clés étrangères étant à NULL n'étaient pas sélectionnées.

    Et puis j'ai découvert qu'une équijointure peut s'écrire autrement que dans la clause WHERE avec un = : tu peux utiliser un INNER JOIN dans la clause FROM, ce qui s'appelle aussi une jointure interne.

    Et de là, j'ai également découvert l'équijointure avec OUTER JOIN, soit la jointure externe. C'est ça qu'il te faut.

    Sache que la solution avec l'UNION est correcte, mais voici ma proposition de solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT Client.NomClient, Commune.Code_Postal, Commune.Nom_Commune
    FROM Client LEFT OUTER JOIN Commune ON Client.IdCommune = Commune.IdCommune;
    Citation Envoyé par goony
    Je pense que j vais poser une question très con
    Il faut jamais dire ça, certains finiraient par le croire

    J'espère que ça t'a aidé
    ++
    Ingénieur Génie Logiciel et Systèmes d'Information
    Management des Nouvelles Technologies

    Ecole Supérieure d'Ingénieurs de Luminy (ESIL), Marseille

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    Tu as simplement besoin d'utiliser une jointure externe.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        SELECT 
            Client.NomClient, 
            Commune.Code_Postal, 
            Commune.Nom_Commune 
        FROM 
            Client
          LEFT JOIN  Commune 
            ON    Client.Id_Commune=Commune.Id_Commune
    te renverra toutes les lignes de Client et les informations trouvées dans Commune quand elles existent (ou Null sinon)
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  5. #5
    Membre habitué Avatar de Original Prankster
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    226
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juillet 2005
    Messages : 226
    Points : 192
    Points
    192
    Par défaut
    Citation Envoyé par al1_24
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    FROM 
            Client
          LEFT JOIN  Commune 
            ON    Client.Id_Commune=Commune.Id_Commune
    Le mot-clé OUTER n'est pas obligatoire ?
    Ingénieur Génie Logiciel et Systèmes d'Information
    Management des Nouvelles Technologies

    Ecole Supérieure d'Ingénieurs de Luminy (ESIL), Marseille

  6. #6
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Citation Envoyé par Original Prankster
    Le mot-clé OUTER n'est pas obligatoire ?
    La norme l'exige (donc il est conseillé de le mettre), mais certains moteurs sont laxistes (ORACLE accepte parfaitement le LEFT JOIN, sans OUTER)
    J'affirme péremptoirement que toute affirmation péremptoire est fausse
    5ième élément : barde-prince des figures de style, duc de la synecdoque
    Je ne réponds jamais aux questions techniques par MP

  7. #7
    Membre du Club
    Inscrit en
    Mars 2005
    Messages
    78
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 78
    Points : 51
    Points
    51
    Par défaut
    Merci bien, j'étais parti sur un UNION et la requete était énorme...
    Le LEFT OUTER JOIN marche très bien, merci. Je me coucherais moins con ce soir

    Mais maintenant, j'ai un second problème.
    reprenons l'exemple précédent, en ajoutant quelques infos :

    table Client : Nom_client, ID_commune
    table commune : ID_commune, nom_commune, code_postal, code_departement
    table departement : code_departement, nom_departement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT 
        client.nom_client,
        commune.code_postal,
        commune.nom_commune,
        departement.nom_departement
    FROM 
        Client 
          LEFT OUTER JOIN Commune 
          ON Client.IdCommune = Commune.IdCommune
    ????????????????
    il faut évidemment remplacer les ????? pour la table departement mais par quoi ?
    sachant que chaque commune est associé à un département.

  8. #8
    Membre habitué Avatar de Original Prankster
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    226
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juillet 2005
    Messages : 226
    Points : 192
    Points
    192
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT
        client.nom_client,
        commune.code_postal,
        commune.nom_commune,
        departement.nom_departement
    FROM
        Client
          LEFT OUTER JOIN Commune
          ON Client.IdCommune = Commune.IdCommune,
        Departement
          INNER JOIN Commune
          ON Departement.code_departement = Commune.code_departement;
    Et voilà

    (Un WHERE marchera aussi, mais sera moins homogène avec le reste)
    Ingénieur Génie Logiciel et Systèmes d'Information
    Management des Nouvelles Technologies

    Ecole Supérieure d'Ingénieurs de Luminy (ESIL), Marseille

  9. #9
    Membre du Club
    Inscrit en
    Mars 2005
    Messages
    78
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 78
    Points : 51
    Points
    51
    Par défaut
    En fait, je venais d'y arriver
    mais avec un left oute join encore.
    Je viens d'essayer avec inner join, et ça ne me renvoit pas les lignes qui n'ont pas la commune
    merci donc à tous, voici ma vraie requête :
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    select
        oa.identifiant,
        ligne.no_ligne "numéro de ligne",
        LIGNE.nom_ligne "nom de ligne",
        oa.point_metrique "PM",
        oa.nom_oa "nom de l'ouvrage",
        type_visite.libelle_type "type de visites",
        UNITE.nom_unite "unité",
        EVEN.nom_EVEN,
        COMMUNE.nom_commune "commune de",
        DEPARTEMENT.nom_departement "département",
        oa.date_de_derniere_visite "date de dernière visite",
        oa.cycle_de_visites "cycle de visites",
        oa.groupe_uic "uic",
        oa.charge_de_tiers "charge de tiers",
        oa.nivellement,
        oa.subaquatique,
        oa.vitesse,
        oa.risque_technologique "risque technologique",
        oa.heurt_routier "risque de heurt routier",
        oa.date_mise_en_service "date de mise en service",
        oa.electricite,
        oa.code_geo "code géographique",
        oa.code_uch "code UCH",
        oa.distance_rail "distance vis-à-vis du rail le plus proche"
    from
        oa
        left outer join COMMUNE
            on oa.id_commune=COMMUNE.ID_commune
        left outer join unite
            on oa.id_unite=UNITE.ID_unite
        left outer join type_visite
            on oa.ID_type_visite=type_visite.ID_type_visite
        left outer join departement
            on departement.code_departement=COMMUNE.code_departement
        left outer join even
            on even.code_EVEN=UNITE.code_EVEN,
        ligne
    where
        oa.no_ligne=ligne.no_ligne

  10. #10
    Membre habitué Avatar de Original Prankster
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    226
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juillet 2005
    Messages : 226
    Points : 192
    Points
    192
    Par défaut
    Waouh ! Sympa la requête

    Félicitations en tout cas
    Ingénieur Génie Logiciel et Systèmes d'Information
    Management des Nouvelles Technologies

    Ecole Supérieure d'Ingénieurs de Luminy (ESIL), Marseille

  11. #11
    Membre du Club
    Inscrit en
    Mars 2005
    Messages
    78
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 78
    Points : 51
    Points
    51
    Par défaut
    Imagine ce que ça donnait en faisant des UNION !!!
    fallait multiplier par 8 !
    En tous cas, encore merci à tous, j'ai encore appris un truc très utile aujourd'hui !

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 10/10/2013, 11h47
  2. Select sur une liste de table
    Par H.ile dans le forum SQL
    Réponses: 0
    Dernier message: 28/07/2009, 13h54
  3. Réponses: 2
    Dernier message: 22/10/2008, 17h53
  4. Recheche sur une ou plusieurs tables
    Par majothi dans le forum VBA Access
    Réponses: 6
    Dernier message: 19/09/2008, 16h13
  5. selection sur une table en fonction de plusieurs ligne
    Par dimdidi dans le forum Langage SQL
    Réponses: 2
    Dernier message: 06/12/2004, 08h42

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