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 :

Probleme SQL jointure externe


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 74
    Par défaut Probleme SQL jointure externe
    Bonjour,
    J'ai un petit souci avec une requête SQL.

    En fait j'ai une table et je souhaite récupérer plusieurs infos de cette table pour les mettre sur une même ligne.

    Exemple :

    Soit ma table T avec champ ID, champ CODE, champ LIBELLE

    Pour chaque ID, nous pouvons avoir plusieurs couples CODE,LIBELLE.

    Je souhaiterais avoir pour chaque ID, sur la même ligne, l'ensemble des LIBELLES correspondants aux CODES 1 et 2.

    J'ai pense utilisé un truc du genre table
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Select ..... 
    From table T, table T1, table T2
    WHERE T.ID = T1.ID (+)
    AND T.ID = T2.ID (+)
    AND T1.CODE ='1'
    AND T2.CODE ='2'
    Le problème est que je récupère les lignes telles quelles :
    ID1, NULL, LIBELLE_DU_CODE1
    ID2, NULL, LIBELLE_DU_CODE2
    ID1, LIBELLE_DU_CODE2, NULLL

    Merci pour votre aide

  2. #2
    Membre Expert

    Homme Profil pro
    Chargé de Développement et d'Analyse de données
    Inscrit en
    Mars 2010
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé de Développement et d'Analyse de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 278
    Par défaut
    Citation Envoyé par VlaMonPseudo Voir le message
    Bonjour,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Select ..... 
    From table T, table T1, table T2
    WHERE T.ID = T1.ID (+)
    AND T.ID = T2.ID (+)
    AND T1.CODE ='1'
    AND T2.CODE ='2'
    Réponse rapide: utilise des JOIN au lieu des
    (+) pour avoir une requête déjà un peu normalisée. Le reste on verra...

    A+

    Etienne ZINZINDOHUE
    Etienne ZINZINDOHOUE
    Billets-Articles

  3. #3
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Vous cherchez à faire un PIVOT.
    Ça se fait ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      SELECT ID,
             MAX(CASE CODE WHEN '1' THEN LIBELLE END) AS LIBELLE_1,
             MAX(CASE CODE WHEN '2' THEN LIBELLE END) AS LIBELLE_2
        FROM MaTable
    GROUP BY ID
    ORDER BY ID ASC;

  4. #4
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par VlaMonPseudo Voir le message
    Pour chaque ID, nous pouvons avoir plusieurs couples CODE,LIBELLE.

    Je souhaiterais avoir pour chaque ID, sur la même ligne, l'ensemble des LIBELLES correspondants aux CODES 1 et 2.
    Le mot "plusieurs" semble dire qu'on ne sait pas combien il y en a et qu'il peut y en avoir un nombre variable.

    Le fait de vouloir mettre sur la même lignes des informations qui se trouvent en colonnes est de la cosmétique et n'est pas le boulot du SQL, surtout quand on ne sait pas combien il peut y avoir de colonnes dans le résultat.

    La réponse naturelle, mais qui donnera le résultat en colonne est celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT ID, LIBELLE
    FROM MaTable
    WHERE CODE = '1'
      OR CODE = '2'
    ORDER BY LIBELLE
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 74
    Par défaut
    Merci!
    Excusez moi je reformule, j'utilise deux tables.
    Voila la requête que j'utilise.
    (pas possible d'utiliser les max et group by car lignes multiples a afficher, merci).

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT co.contractnumber, 
           m1.credentialrefid,
           m1.value,
           m2.credentialrefid,
           m2.value
    FROM contract co,
         marche m1,
         marche m2
    WHERE cl.contractid = co.contractid
          AND cl.userid = u.userid
          AND co.contratid = m1.marcheid (+)
          AND co.contratid = m1.marcheid (+)
          AND co.contractnumber = '123456'

    Resultat :
    Je me retrouve avec 4 lignes.

    123456, 1, valeur1, 1, valeur1
    123456, 1, valeur1, 3, valeur3
    123456, 3, valeur3, 1, valeur1
    123456, 3, valeur3, 3, valeur3


    J'ai donc un produit cartesien.
    J'oubli une condition mais laquelle.

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
          AND co.contratid = m1.marcheid (+)
          AND co.contratid = m1.marcheid (+)

  7. #7
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    La syntaxe normalisée depuis 1992 pour les jointures utilise le mot clé JOIN. Il serait peut-être temps de s'y mettre, 18 ans plus tard !

    Votre première condition de jointure fait intervenir un alias de table 'cl' qui ne figure pas dans vos tables du FROM !

    Votre deuxième condition de jointure fait intervenir un alias de table 'u' qui ne figure pas dans vos tables du FROM !

    Bref, votre requête ne peut pas fonctionner !

    Et comme essaye de le faire comprendre Waldar, il y a deux fois la même condition de jointure !

    J'ajoute qu'il manque la condition de jointure avec l'alias de table 'm2' !

    En écrivant votre requête de façon normalisée, vous auriez tout de suite vu ces erreurs !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT co.contractnumber, 
           m1.credentialrefid,
           m1.value,
           m2.credentialrefid,
           m2.value
    FROM contract co
    INNER JOIN cl ON cl.contractid = co.contractid -- Quel vrai nom de table ?
      INNER JOIN u ON cl.userid = u.userid -- Quel vrai nom de table ?
    LEFT OUTER JOIN marche m1 ON co.contratid = m1.marcheid
    LEFT OUTER JOIN marche m2 ON co.contratid = m2.marcheid -- Supposition
    WHERE co.contractnumber = '123456'
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 74
    Par défaut
    Citation Envoyé par VlaMonPseudo Voir le message
    Merci!
    Excusez moi je reformule, j'utilise deux tables.
    Voila la requête que j'utilise.
    (pas possible d'utiliser les max et group by car lignes multiples a afficher, merci).

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT co.contractnumber, 
           m1.credentialrefid,
           m1.value,
           m2.credentialrefid,
           m2.value
    FROM contract co,
         marche m1,
         marche m2
    WHERE cl.contractid = co.contractid
          AND cl.userid = u.userid
          AND co.contratid = m1.marcheid (+)
          AND co.contratid = m2.marcheid (+)
          AND co.contractnumber = '123456'

    Resultat :
    Je me retrouve avec 4 lignes.

    123456, 1, valeur1, 1, valeur1
    123456, 1, valeur1, 3, valeur3
    123456, 3, valeur3, 1, valeur1
    123456, 3, valeur3, 3, valeur3


    J'ai donc un produit cartesien.
    J'oubli une condition mais laquelle.
    Désolé j'ai fais une erreur en recopiant.
    J'avais bien mieux m2 dans mon code, donc le problème est ailleurs

  9. #9
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Le problème c'est qu'il manque des tables, des descriptions, des contenus, vous lancez les informations au compte-goute et ça évolue tous les trois posts... Pas facile de vous aider efficacement.

Discussions similaires

  1. BO + SQL serveur : probleme de jointures externes
    Par bastoonet dans le forum Designer
    Réponses: 2
    Dernier message: 27/09/2006, 11h59
  2. [SQL] Jointure externe dans "les 2 sens"
    Par Bounty Killer dans le forum Oracle
    Réponses: 3
    Dernier message: 04/05/2006, 10h56
  3. Probleme de jointure externe ...
    Par amenis dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 06/09/2005, 09h59
  4. [SQL] jointure externe
    Par Sniper37 dans le forum Langage SQL
    Réponses: 6
    Dernier message: 02/09/2005, 15h06
  5. [SQL] jointure externe avec 3 tables, comment faire ....
    Par grumbok dans le forum Langage SQL
    Réponses: 2
    Dernier message: 04/08/2005, 16h13

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