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

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

    Informations forums :
    Inscription : Avril 2006
    Messages : 74
    Points : 47
    Points
    47
    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 émérite

    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
    Points : 2 856
    Points
    2 856
    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

  3. #3
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    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 453
    Points : 18 388
    Points
    18 388
    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
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 801
    Points : 34 063
    Points
    34 063
    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

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

    Informations forums :
    Inscription : Avril 2006
    Messages : 74
    Points : 47
    Points
    47
    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 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    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 453
    Points : 18 388
    Points
    18 388
    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
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 74
    Points : 47
    Points
    47
    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

  8. #8
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    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 453
    Points : 18 388
    Points
    18 388
    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.

  9. #9
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 801
    Points : 34 063
    Points
    34 063
    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'

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