Requete jointure externe

Bonjour à tous...
j'ai une petite question pour la construction d'une requete

j'ai deux tables :

VOL (cle_vol, date_vol, immatriculation_vol)
MESSAGE(cle_message, cle_vol)

et j'aimerais avoir la liste des vols à partir d'une date et savoir si un message particulier est sur le vol, enfin quelque chose comme ça... :

cle_vol cle_message
1 212
2 212
3
4 212
5 212
6
7
8 212

...

pour le moment j'ai fait

select v.cle_vol,
m.cle_message

from vol v,
message m

where v.cle_vol=m.cle_vol(+) and
v.immatriculation ='aaa' and
p.cle_message = 212 and
v.date_vol >= to_date ('06-jan-03')

mais ça me donne que les vols où la cle_message=212..
les autres ne sont pas retenus...

si vous avez une solution.. ou une idée à me donner merci...

Letissya

10 réponses

  • Votes
  • Date
  • Date décroissante
  1. Modérateur
    Bonjour,

    C'est quoi comme base ? (pour savoir quel SQL)

    Si tu fais "p.cle_message is not null" au lieu de " p.cle_message = 212", ça donne quoi ?

    A+ Blux
     "Les cons, ça ose tout.
    
    C'est même à ça qu'on les reconnait"
    1. Contributeur
      Bonjour Letssya.

      Dans ta clause where, tu as mis "and p.cle_message = 212"
      Il est donc normal que cette requête ne te sorte que les vols pour lesquels la cle_message est 212.
      En fait, si j'ai bien compris, tu voudrais en résultat la liste des vols postérieurs à une certaine date, avec à côté le message éventuel s'y rapportant.
      Tu n'as pas besoin pour ça de rajouter la clause sur cle_message à mon avis.
      Si je me trompe sur la bonne compréhension de ton pb, n'hésites pas à en remettre une couche.
      a+

        (:•Þ  Pitu  (Apprenti Ipl)
      1. oui je suis d'accord avec toi, j'ai essayé d'enlever la condition p.cle_message = 212

        pour la description du problème tu as tout compris... sauf que je veux un message bien précis (ex : 212) et pas un autre...

        Letissya
      2. Contributeur
        @letissya:o( Ouuuuiiiiiiiiiinnnnnn ... Je comprends plus rien ...

        Tu veux la liste des vols en faisant une jointure sur tes 2 tables, mais tu ne veux QUE ceux qui ont le message 212, c'est ça ?
        (Je ne parle pas de date, puisque tu as résolu ce pb).
        Ben ... c'est pas ce que tu as obtenu avec ta requête ?
        Non, bien évidemment, puisque tu pose la question. Mais là, je ne comprends pas ...
          (:•Þ  Pitu  (Apprenti Ipl)
    2. ORACLE7

      ben ça me donne un truc comme ça :

      1 512
      1 847
      1 582
      2 987
      2 986
      2 957
      2 212

      ...

      Letissya
      1. Modérateur
        Ca veut donc dire qu'il y plusieurs messages possibles pour chaque vol, il faut bien mettre le numéro de message pour avoir le message particulier.

        Je crains cependant de ne pas avoir tout compris l'énoncé du problème... peux-tu en rajouter (ou le reposer en d'autres termes) ?

        A+ Blux
         "Les cons, ça ose tout.
        
        C'est même à ça qu'on les reconnait"
        1. oui il peut y avoir plusieurs messages sur un vol...
          dans la table message je peux avoir ça :

          MESSAGE :
          cle_message cle_vol
          212 1
          578 1
          587 2
          212 6
          587 3
          986 3
          512 6
          212 4
          878 5
          965 5
          125 3

          et moi ce que je voudrais obtenir en fait c'est

          cle_vol cle_message
          1 212
          2
          3
          4 212
          5
          6 212

          en fait je veux avoir tous les vols à partir d'une certaine date... et que pour chaque vol je puisse savoir si un message particulier est apparu ou non..
          je ne veux pas juste les vols où ce message est apparu... je veux aussi les vols où le message n'est pas apparu même s'il y a eu des messages différents ou pas de messages du tout...

          c'est plus clair ?

          Letissya
          1. Contributeur
            Je crois effectivement que la contradiction est dans l'énoncé du problème :).

            -= Fu Xuen =-
            1. Modérateur
              v.cle_vol=m.cle_vol(+) serait à mettre dans la jointure et non dans le where, c'est-à-dire

              SELECT ...
              ON v.cle_vol=m.cle_vol(+)
              WHERE

              Ca irait pas mieux ?

              A+ Blux
               "Les cons, ça ose tout.
              
              C'est même à ça qu'on les reconnait"
              1. Contributeur
                C'est du sql Oracle, ça ?

                  (:•Þ  Pitu  (Apprenti Ipl)
            2. ben non car le (+) c'est la jointure...
              sinon il faut que j'utilise OUTER JOIN et pas le (+)... mais ma version d'ORACLE ne supporte pas la syntaxe avec JOIN..
              donc, je ne pense pas que ça vienne de là.. je crois plutot que je doit faire deux requetes ... pour arriver à mes fins...

              Letissya
              1. Contributeur
                Là, c'est sûr que tu arriveras à ce que tu cherches.
                C'est pas top, mais ...
                Parfois, le Mieux est l'ennemi du Bien
                  (:•Þ  Pitu  (Apprenti Ipl)
              2. Modérateur
                as-tu essayé ce que j'ai donné ?

                A+ Blux
                 "Les cons, ça ose tout.
                
                C'est même à ça qu'on les reconnait"
              3. @bluxc'est à dire ??

                la condition après le ON ... ça ne fonctionne pas parce que c'est une commande qui n'est pas compatible avec ORACLE... (mais j'ai quand meme essayée si c'est ce que tu veux savoir ..)

                Letissya
              4. Modérateur
                @bluxC'est curieux, car en ORACLE 9, ça marche bien (et ça doit pas être nouveau) :

                SELECT ...
                FROM ...
                ON ...
                WHERE ...;

                A+ Blux
                 "Les cons, ça ose tout.
                
                C'est même à ça qu'on les reconnait"
              5. @bluxben moi j'ai une erreur, je ne peux pas executer le requete.. :o(

                Letissya
            3. Contributeur
              Hmm, Hmm ...
              alors, plutôt que d'effectuer une jointure, tu devrais peut-être essayer avec des select imbriqués ...
              Non ?

                (:•Þ  Pitu  (Apprenti Ipl)
              1. ben j'ai quand meme des contraintes de temps d'execution.. alors les requetes imbriquées j'essais d'éviter... enfin je vais voir...

                Letissya