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

Oracle Discussion :

[Débutant]Soucis requête jointure externes (8-i)


Sujet :

Oracle

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mars 2004
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 63
    Points : 39
    Points
    39
    Par défaut [Débutant]Soucis requête jointure externes (8-i)
    Bonjour à toutes et à tous,

    Pour entrer directement dans le vif du sujet voic 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
    23
    24
     
    SELECT decode(F.fatype, 'F','Fa','A','Av') "Type Fact",
    lpad(F.fadrec,9,' ') "Date Recep", 
    F.fanfac "Num Fact",
    nvl(F.famtht,0)-nvl(F.faremi,0)+nvl(F.fatva,0) "Mt TTC",
    F.factier "Num Four",
    T.fnfo "Fournisseur",
    F.fanoeng "NumEng",
    F.enexe "ExeEngt",
    decode(F.faceo,'B','BT','O','OS','C','Cde') "TE",
    C.dest "Dest",
    K.Pecodop "Nom"
    FROM ksaifac F, ksbsuifa C, kfourni T, KPERSONL K, KVENG ENG
    WHERE (F.faexe=C.faexe) AND (F.fanfac=C.fanfac) AND (F.fatype=C.fatype)
    AND (F.factier=T.fcfo)
    AND (F.fanoeng(+)=ENG.ENNO)
    AND (ENG.PEC=K.PEC)
    AND (F.valid is null)
    AND (C.dest like UPPER('%&&PARAM1%'))
    AND (F.fadrec >= DECODE('&&PARAM2',null,'01-JAN-00','&&PARAM2'))
    AND (C.rowid=(SELECT min(C2.rowid) 
                 FROM ksbsuifa C2 
                 WHERE C.fanfac=C2.fanfac))
    ORDER BY F.fadrec
    Je préferes vous prevenir que je travaille sur les tables d'un progiciel que je ne connais pas très bien et qui est étrangement construit...

    Pour être bref, c'est ici que j'ai des soucis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AND (F.fanoeng(+)=ENG.ENNO)
    En effet, il faudrait que je puisse ramener dans mes résultats la colonne FANOENG sachant que certains enregistrement n'ont pas de valeur pour ce champs là, par exemple
    890 2002 BT NORD
    890 2002 NORD
    890 2002 BT NORD
    512 2002 OS CENT
    512 2002 CENT
    1354 2002 CO CENT
    Or la requête malgrès la jointure externe ne me raméne pas les enregistrement qui ne respectent pas la jointure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AND (F.fanoeng(+)=ENG.ENNO)
    ...DU coup j'ai l'impression que c'est pas trop clair ce que je raconte...

    Ma question est donc est ce que j'utilise la jointure comme il faut ?
    Il y a-t-il d'autres méthodes avec Oracle 8-i permettant de ramener les bons enregistrement , c'est à dire tous ce de la table F completer des données de la table ENG lorsque la jointure est réspécté ???

    Merci d'avance pour vos réponses et désolés d'avance pour la charabia

    Jdotti

  2. #2
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Dans quelle table peux-tu ne pas avoir d'enregistrements ? ksaifac ou KVENG ?
    Un problème sans solution est un problème mal posé

    Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Mars 2004
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 63
    Points : 39
    Points
    39
    Par défaut
    Bonjour et merci de ta réponse ,

    C'est dans la table KSAIFAC qu'il est possible que le champs FANOENG (correspondant au champs ENNO de la vue KVENG) qui peu être vide/null...

  4. #4
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Alors je pense que cette condition pose problème :
    Essaie :
    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
    SELECT decode(F.fatype, 'F','Fa','A','Av') "Type Fact", 
    lpad(F.fadrec,9,' ') "Date Recep", 
    F.fanfac "Num Fact", 
    nvl(F.famtht,0)-nvl(F.faremi,0)+nvl(F.fatva,0) "Mt TTC", 
    F.factier "Num Four", 
    T.fnfo "Fournisseur", 
    F.fanoeng "NumEng", 
    F.enexe "ExeEngt", 
    decode(F.faceo,'B','BT','O','OS','C','Cde') "TE", 
    C.dest "Dest", 
    K.Pecodop "Nom" 
    FROM ksaifac F, ksbsuifa C, kfourni T, KPERSONL K, KVENG ENG 
    WHERE (F.faexe=C.faexe) AND (F.fanfac=C.fanfac) AND (F.fatype=C.fatype) 
    AND (F.factier=T.fcfo) 
    AND (F.fanoeng=ENG.ENNO(+)) 
    AND (ENG.PEC(+)=K.PEC) 
    AND (F.valid is null) 
    AND (C.dest like UPPER('%&&PARAM1%')) 
    AND (F.fadrec >= DECODE('&&PARAM2',null,'01-JAN-00','&&PARAM2')) 
    AND (C.rowid=(SELECT min(C2.rowid) 
                 FROM ksbsuifa C2 
                 WHERE C.fanfac=C2.fanfac)) 
    ORDER BY F.fadrec
    Un problème sans solution est un problème mal posé

    Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.

  5. #5
    Nouveau membre du Club
    Inscrit en
    Mars 2004
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 63
    Points : 39
    Points
    39
    Par défaut
    Super merci de ton coup de main...

    Malheureusement, oracle est nettement moins solidaire
    Voici donc sa réponse :
    ERROR à la ligne 15 :
    ORA-01417: une table peut être de jointure externe pour une autre table au moins

  6. #6
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Dans la précipitation, j'avais oublié ce petit détail

    Essaie :
    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
    SELECT decode(F.fatype, 'F','Fa','A','Av') "Type Fact", 
           lpad(F.fadrec,9,' ') "Date Recep", 
           F.fanfac "Num Fact", 
           nvl(F.famtht,0)-nvl(F.faremi,0)+nvl(F.fatva,0) "Mt TTC", 
           F.factier "Num Four", 
           T.fnfo "Fournisseur", 
           F.fanoeng "NumEng", 
           F.enexe "ExeEngt", 
           decode(F.faceo,'B','BT','O','OS','C','Cde') "TE", 
           C.dest "Dest", 
           KENG.Pecodop "Nom" 
    FROM ksaifac F, ksbsuifa C, kfourni T,
         (select Pecodop, enno
          from KPERSONL K, KVENG ENG
          where ENG.PEC=K.PEC) KENG
    WHERE (F.faexe=C.faexe) 
    AND (F.fanfac=C.fanfac) 
    AND (F.fatype=C.fatype) 
    AND (F.factier=T.fcfo) 
    AND (F.fanoeng=KENG.ENNO(+)) 
    AND (F.valid is null) 
    AND (C.dest like UPPER('%&&PARAM1%')) 
    AND (F.fadrec >= DECODE('&&PARAM2',null,'01-JAN-00','&&PARAM2')) 
    AND (C.rowid=(SELECT min(C2.rowid) 
                 FROM ksbsuifa C2 
                 WHERE C.fanfac=C2.fanfac)) 
    ORDER BY F.fadrec
    Un problème sans solution est un problème mal posé

    Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.

  7. #7
    Nouveau membre du Club
    Inscrit en
    Mars 2004
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 63
    Points : 39
    Points
    39
    Par défaut Merci beaucoup
    Et voilà , comme à chaque fois, je me prends la tête pendant des heures sur un truc, puis en désespoir de cause je viens demander de l'aide sur Developpez.com et on me fournit toujours de super réponse en quelques heures...

    Tout ça pour dire que cela fonctionne, je l'ai encore un peu modifier parce qu'on m'a demander de rajouter encore certains champs, mais le plus dur est fait...

    Merci merci merci...


    Jérémy
    PS : En revanche je ne comprends pas bien pourquoi cela fonctionnais pas et pourquoi cela fonctionne... Si tu en as encore la patience , peut-être pouras tu me donner un lien/un début d'explication ?

  8. #8
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    1. Sur la requête que tu avais proposé 2 choses étaient fausses :
    - tu faisais une jointure externe du mauvais côté
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (F.fanoeng(+)=ENG.ENNO)
    le (+) devant être du côté où la valeur peut ne pas exister

    - tu faisais une jointure non externe entre ENG.PEC et K.PEC
    or ENG.ENNO n'existait pas pour F.FANOENG, cette condition n'était pas vérifiée. C'était donc comme si tu n'avais pas fait de jointure externe entre ENG.ENNO et F.FANOENG.

    2. La requête que je t'avais proposé ne fonctionnait pas parce que je faisais pour une table 2 jointures externes sur 2 tables différentes.

    La dernière solution que je t'ai proposée fonctionne, car je fais dans un premier temps la jointure entre les tables KPERSONL et KVENG qui est toujours vérifiée et dans un deuxième temps je fais une jointure externe entre KVENG et KSAIFAC (=> les jointures entre les 3 tables ne sont plus simultanées)
    Un problème sans solution est un problème mal posé

    Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.

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

Discussions similaires

  1. Requête Jointure externe retournant 0 si pas de liaison
    Par jubourbon dans le forum Langage SQL
    Réponses: 7
    Dernier message: 17/10/2011, 16h59
  2. Réponses: 11
    Dernier message: 12/08/2010, 15h24
  3. Souci de jointures externes multiples
    Par dJe781 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 09/02/2009, 14h25
  4. [Débutant]Somme et jointure externe
    Par teks9 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 05/06/2008, 10h59
  5. Réponses: 11
    Dernier message: 16/12/2006, 15h34

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