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 :

Difficulté avec une requête SQL


Sujet :

Langage SQL

  1. #1
    Candidat au Club
    Inscrit en
    Avril 2011
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Avril 2011
    Messages : 2
    Points : 4
    Points
    4
    Par défaut Difficulté avec une requête SQL
    Bonjour,

    Tout d'abord, mes excuses pour le titre : je n'ai pas trouvé plus éloquent.

    J'ai en effet besoin d'aide pour construire une requête.

    La situation est la suivante. Je possède deux tables avec deux attributs en "commun". J'utilise des guillemets car j'aimerais faire une jointure avec une condition : si attribut de la table 1 n'est pas dans la table 2, alors considéré sa valeur à 0.

    Ayant du mal aussi avec l'explication textuelle, je vous ai mis un exemple en fichier joint. Comme vous pouvez le voir, si dans la table 1, nous avons le couple (IdPays, IdEquipe) dans la table 2, on fait une jointure normale.

    Par contre, si dans la table 1, seul l'attribut IdPays se trouve dans la table 2, on considère l'attribut IdEquipe avec une valeur égale à 0 pour la jointure.

    Si je n'ai pas été assez clair, n'hésitez pas à me questionner.

    En vous remerciant grandement d'avance pour la lecture de mon post et potentiellement votre aide.
    Images attachées Images attachées  

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    S'il n'y a bien qu'un IdEquipe à 0 par IdPays alors tu peux essayer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    select e.*,
           coalesce(ep.NomEquipe,(select NomEquipe 
                                    from equipe ep2 
                                   where ep2.IdPays = e.IdPays 
                                     and ep2.IdEquipe = 0
                                 )
                    ) as NomEquipe
      from employe e
      left join equipe ep 
        on e.IdPays = ep.IdPays 
       and e.IdEquipe = ep.IdEquipe
     order by IdEmp
    En gros une jointure externe (LEFT JOIN) pour récupérer toutes les lignes de employe, puis quand elle n'a pas de correspondance (donc NULL) utiliser coalesce et une requête corrélée.

    J'ai un peu réfléchi à comment éviter la requête corrélée, mais je ne vois rien de super fancy, je poste un jeu de test pour ceux qui auraient de meilleurs idées (mais une requête corrélée n'est pas mauvaise en soit surtout si la base est correctement indexée) :
    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
    with employe as (
      select 1 as IdEmp, 36000 as IdPays  , 3 as IdEquipe, 250 as Salaire from dual union all
      select 2         , 36001            , 1            , 400            from dual union all
      select 3         , 36000            , 5            , 600            from dual union all
      select 4         , 36002            , 1            , 200            from dual union all
      select 5         , 36000            , 6            , 100            from dual union all
      select 6         , 36000            , 18           , 300            from dual
    ),
    equipe as (
      select 36000 as IdPays, 3 as IdEquipe, 'EquipeA' as NomEquipe from dual union all
      select 36000          , 0            , 'EquipeABis'           from dual union all
      select 36001          , 1            , 'EquipeB'              from dual union all
      select 36002          , 1            , 'EquipeC'              from dual
    )
    select e.*,
           coalesce(ep.NomEquipe,(select NomEquipe 
                                    from equipe ep2 
                                   where ep2.IdPays = e.IdPays 
                                     and ep2.IdEquipe = 0
                                 )
                    ) as NomEquipe
      from employe e
      left join equipe ep 
        on e.IdPays = ep.IdPays 
       and e.IdEquipe = ep.IdEquipe
     order by IdEmp
     
         IDEMP     IDPAYS   IDEQUIPE    SALAIRE NOMEQUIPE
    ---------- ---------- ---------- ---------- ----------
             1      36000          3        250 EquipeA
             2      36001          1        400 EquipeB
             3      36000          5        600 EquipeABis
             4      36002          1        200 EquipeC
             5      36000          6        100 EquipeABis
             6      36000         18        300 EquipeABis

  3. #3
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Avec deux jointures !
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT emp.IdEmp, emp.IdPays, emp.IdEquipe, emp.Salaire,
           coalesce(ep1.NomEquipe, ep2.NomEquipe) AS NomEquipe
      FROM employe emp
           LEFT OUTER JOIN equipe ep1 
             ON ep1.IdPays   = emp.IdPays 
            AND ep1.IdEquipe = emp.IdEquipe
           LEFT OUTER JOIN equipe ep2
             ON ep2.IdPays   = emp.IdPays
            AND ep2.IdEquipe = 0
     ORDER BY emp.IdEmp asc;

  4. #4
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Avec deux jointures !
    (au moins j'avais écrit le jeu de test...)

  5. #5
    Candidat au Club
    Inscrit en
    Avril 2011
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Avril 2011
    Messages : 2
    Points : 4
    Points
    4
    Par défaut
    Merci à tous les deux.

    J'avais bidouillé quelque chose semblable à la proposition de skuatamad. Mais le coup de la double jointure me convient parfaitement .

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 06/10/2009, 09h37
  2. Réponses: 4
    Dernier message: 11/06/2009, 16h03
  3. [MySQL] Problème avec une requête SQL
    Par chobol dans le forum PHP & Base de données
    Réponses: 12
    Dernier message: 11/05/2006, 12h29
  4. [VB]Problème avec une requête SQL
    Par Tyrael62 dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 18/03/2006, 17h47
  5. [VBA] difficultés avec une requête INSERT
    Par elias dans le forum Access
    Réponses: 7
    Dernier message: 06/09/2005, 14h53

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