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 :

Aide sur une requête


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Inscrit en
    Décembre 2006
    Messages
    196
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 196
    Points : 89
    Points
    89
    Par défaut Aide sur une requête
    Bonjour à tous,

    Voici donc ma 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
     
    SELECT distinct 
    	a.capname, b.curcode, 	a.q_id, c.accdate, d.ccy,
            e.accno, f.bankno, h.rate
    FROM capent a, cur b, journals c, journal_ent d,
            acc e, bank f, count g, cur_rates h
    WHERE (     (a.ccy_code_information = b.code)
            AND (a.cic_id = c.cic_id)
            AND (e.gla_id = d.gla_id)
            AND (c.glj_id = d.glj_id)
            AND (f.ba_id = d.ba_id)
            AND (g.ctp_id = f.ctp_id)
            AND (a.cic_id = h.cic_id)
     
            AND (d.ccy_code = h.ccy_code)
            AND (d.ccy_code IN ('EUR', 'GBP'))        
     
            AND (c.journal_type = 'F')
            AND (d.description = 'FD')
    	AND (a.q_id = 219)
    	AND (h.rate_date = '05-dec-2008')
          )
    Le problème est que si je n'ai pas d'entrées dans la table 'h' concernant le 'h.ccy_code' la ligne n'apparait pas alors que je désire voir apparaître le 'cur_rates h' à vide si il n'existe pas.


    Merci

  2. #2
    Modérateur
    Avatar de Chtulus
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2008
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2008
    Messages : 3 094
    Points : 8 678
    Points
    8 678
    Par défaut
    Bonjour,

    Commencez par utiliser des jointures normalisées. Ainsi avec une jointure externe plus de soucis !

    http://sqlpro.developpez.com/cours/sqlaz/jointures/




  3. #3
    Membre régulier
    Inscrit en
    Décembre 2006
    Messages
    196
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 196
    Points : 89
    Points
    89
    Par défaut
    Merci pour le conseil mais malgré la modif avec une jointure externe, cela ne fonctionne pas:

    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
     
    SELECT DISTINCT 
    	a.capname, b.curcode, 	a.q_id, c.accdate, d.ccy,
            e.accno, f.bankno, h.rate
    FROM capent a, cur b, journals c,
            acc e, bank f, count g,
     
           journal_ent d	
           RIGHT (ou LEFT) JOIN cur_rates h
              ON (d.ccy_code = h.ccy_code)
     
    WHERE (     (a.ccy_code_information = b.code)
            AND (a.cic_id = c.cic_id)
            AND (e.gla_id = d.gla_id)
            AND (c.glj_id = d.glj_id)
            AND (f.ba_id = d.ba_id)
            AND (g.ctp_id = f.ctp_id)
            AND (a.cic_id = h.cic_id)
     
            AND (d.ccy_code IN ('EUR', 'GBP'))        
     
            AND (c.journal_type = 'F')
            AND (d.description = 'FD')
    	AND (a.q_id = 219)
    	AND (h.rate_date = '05-dec-2008')
          )
    ou la jointure est mal faite

  4. #4
    Expert confirmé Avatar de Cybher
    Homme Profil pro
    Consultant réseaux et sécurité
    Inscrit en
    Mai 2005
    Messages
    3 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Consultant réseaux et sécurité
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Points : 4 644
    Points
    4 644
    Par défaut
    salut

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AND (h.rate_date = '05-dec-2008'
    cette condition te pose problème car s'il n'y a pas de correspondance dans h, rate_date ne vaudra jamais cette valeur
    tu peux par exemple remonté dans cette condition dans ta condition de jointure (on)

    et écris tout en jointure normalisée, c'est plus propre et plus lisible

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 849
    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 849
    Points : 52 975
    Points
    52 975
    Billets dans le blog
    6
    Par défaut
    '05-dec-2008' n'est pas une date. C'est une chaine de caractères. Les dates s'expriment sous la forme ISO court AAAAMMJJ ou long : AAAA-MM-JJ.
    Si possible faites un CAST pour trantyper en DATE.

    Donc avec des jointures normalisée (datant de 1992 donc plus de 15 ans...) et non l'infâme bouliboulga que vous noua avez donné, cela devrait être :

    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
    SELECT DISTINCT a.capname, b.curcode, a.q_id, c.accdate, d.ccy,
            e.accno, f.bankno, h.rate
     
    FROM   capent a
           INNER JOIN cur b
                 ON a.ccy_code_information = b.code
           INNER JOIN journals c
                 ON a.cic_id = c.cic_id
           INNER JOIN journal_ent d	
                 ON c.glj_id = d.glj_id
           INNER JOIN acc e
                 ON e.gla_id = d.gla_id
           INNER JOIN bank f
                 ON f.ba_id = d.ba_id
           INNER JOIN count g
                 ON g.ctp_id = f.ctp_id       
           LEFT OUTER JOIN cur_rates h
                ON d.ccy_code = h.ccy_code
                   AND a.cic_id = h.cic_id
     
    WHERE  d.ccy_code IN ('EUR', 'GBP')
      AND  c.journal_type = 'F'
      AND  d.description = 'FD'
      AND  a.q_id = 219
      AND  h.rate_date = CAST('20081205' AS DATE)
    J'aire votre attention sur le fait que vous avez une jointure circulaire. Cela vous aurait sauté aux yeux si vous avez eu le courage de faire des JOIN !

    Bref, apprenez le SQL. Mes livres comme mon site web peuvent vous y aider !

    A +

Discussions similaires

  1. [SQL] Besoin d'aide sur une requête
    Par Angath dans le forum Langage SQL
    Réponses: 2
    Dernier message: 17/01/2006, 16h26
  2. Réponses: 1
    Dernier message: 03/08/2005, 11h41
  3. Besoin d'aide sur une requête (JOIN + COUNT ?)
    Par PanzerKunst dans le forum Langage SQL
    Réponses: 2
    Dernier message: 01/06/2005, 10h29
  4. Aide sur une requête
    Par TshAw dans le forum Langage SQL
    Réponses: 4
    Dernier message: 28/02/2005, 11h42
  5. Aide sur une requête (Group By...??)
    Par Cocolapin dans le forum Langage SQL
    Réponses: 4
    Dernier message: 12/12/2004, 10h26

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