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

SQL Oracle Discussion :

Requete jointure externe


Sujet :

SQL Oracle

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 20
    Points : 16
    Points
    16
    Par défaut Requete jointure externe
    Bonjour,

    J'ai un souci sur une requête et je galère, je n'arrive pas à trouver :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT TD_DW_SINISTRE.SOURCE, TD_DW_SINISTRE.ID_CTRTE, TD_DW_SINISTRE.ID_PROD, TD_DW_SINISTRE.ID_OPT, TD_DW_SINISTRE.ID_SOC, TD_DW_SINISTRE.ID_INTERV_DISTRIB, TD_DW_SINISTRE.ID_STRUCT, TD_DW_SINISTRE.TYP_SIN, TD_DW_SINISTRE.DT_PASS_POS_SIN, TD_DW_SINISTRE.ID_UNQ_ROL_ASS, TD_DW_SINISTRE.ID_UNQ_CONT, TD_DW_SINISTRE.TYP_ENREG, TD_DW_ROL_ASS.ID_UNQ_GEN_PROD, TD_DW_GEN_PRODUIT.ID_GEN_PROD, TD_DW_PEC.SOURCE, TD_DW_PEC.TYP_ENREG, TD_DW_PEC.NUM_LOT_DE, TD_DW_CONTRAT.ID_UNQ_INTERV, TD_DW_SINISTRE.PROV_SIN_PROB, TD_DW_PEC.ID_UNQ_PEC, TD_DW_PEC.NUM_DEC, TD_DW_PEC.ID_UNQ_SIN, TD_DW_CONTRAT.DT_SIGN_CONT, TD_DW_PROV_SIN.ID_UNQ_SIN 
    FROM
     TD_DW_SINISTRE, TD_DW_PEC, TD_DW_GEN_PRODUIT, TD_DW_ROL_ASS, TD_DW_CONTRAT, TD_DW_PROV_SIN 
    WHERE
     
     TD_DW_PEC.ID_UNQ_SIN = TD_DW_SINISTRE.ID_UNQ_SIN (+) 
    AND TD_DW_SINISTRE.ID_UNQ_CONT = TD_DW_CONTRAT.ID_UNQ_CONT(+)
    AND TD_DW_SINISTRE.ID_UNQ_ROL_ASS = TD_DW_ROL_ASS.ID_UNQ_ROL_ASS (+)
    AND TD_DW_ROL_ASS.ID_UNQ_GEN_PROD = TD_DW_GEN_PRODUIT.ID_UNQ_GEN_PROD (+)
    AND NOT
    TD_DW_PROV_SIN.ID_UNQ_SIN =
    TD_DW_SINISTRE.ID_UNQ_SIN (+)
    j'ai comme message erreur ORA-01417: une table peut être de jointure externe pour une autre table au moins.

  2. #2
    Membre éclairé Avatar de Z3phur
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2007
    Messages
    680
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2007
    Messages : 680
    Points : 807
    Points
    807
    Par défaut
    Citation Envoyé par sophie2010 Voir le message
    Bonjour,

    J'ai un souci sur une requete et je galère, je n'arrive pas à trouver :

    SELECT TD_DW_SINISTRE.SOURCE, TD_DW_SINISTRE.ID_CTRTE, TD_DW_SINISTRE.ID_PROD, TD_DW_SINISTRE.ID_OPT, TD_DW_SINISTRE.ID_SOC, TD_DW_SINISTRE.ID_INTERV_DISTRIB, TD_DW_SINISTRE.ID_STRUCT, TD_DW_SINISTRE.TYP_SIN, TD_DW_SINISTRE.DT_PASS_POS_SIN, TD_DW_SINISTRE.ID_UNQ_ROL_ASS, TD_DW_SINISTRE.ID_UNQ_CONT, TD_DW_SINISTRE.TYP_ENREG, TD_DW_ROL_ASS.ID_UNQ_GEN_PROD, TD_DW_GEN_PRODUIT.ID_GEN_PROD, TD_DW_PEC.SOURCE, TD_DW_PEC.TYP_ENREG, TD_DW_PEC.NUM_LOT_DE, TD_DW_CONTRAT.ID_UNQ_INTERV, TD_DW_SINISTRE.PROV_SIN_PROB, TD_DW_PEC.ID_UNQ_PEC, TD_DW_PEC.NUM_DEC, TD_DW_PEC.ID_UNQ_SIN, TD_DW_CONTRAT.DT_SIGN_CONT, TD_DW_PROV_SIN.ID_UNQ_SIN
    FROM
    TD_DW_SINISTRE, TD_DW_PEC, TD_DW_GEN_PRODUIT, TD_DW_ROL_ASS, TD_DW_CONTRAT, TD_DW_PROV_SIN
    WHERE

    TD_DW_PEC.ID_UNQ_SIN = TD_DW_SINISTRE.ID_UNQ_SIN (+)
    AND TD_DW_SINISTRE.ID_UNQ_CONT = TD_DW_CONTRAT.ID_UNQ_CONT(+)
    AND TD_DW_SINISTRE.ID_UNQ_ROL_ASS = TD_DW_ROL_ASS.ID_UNQ_ROL_ASS (+)
    AND TD_DW_ROL_ASS.ID_UNQ_GEN_PROD = TD_DW_GEN_PRODUIT.ID_UNQ_GEN_PROD (+)
    AND NOT
    TD_DW_PROV_SIN.ID_UNQ_SIN =
    TD_DW_SINISTRE.ID_UNQ_SIN (+)


    j'ai comme message erreur ORA-01417: une table peut être de jointure externe pour une autre table au moins.
    Bonjour,

    tu as mis deux fois la même table est jointure externe et oracle le refuse.
    ==========================================
    La justice sans la force est impuissante, la force sans la justice est tyrannique...

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 20
    Points : 16
    Points
    16
    Par défaut
    Oui j'ai bien compris que c'était ca le problème. Mais je ne sais pas comment formuler ma requête de façon à avoir la jointure de ces tables :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    TD_DW_PEC.ID_UNQ_SIN = TD_DW_SINISTRE.ID_UNQ_SIN (+) 
    AND TD_DW_SINISTRE.ID_UNQ_CONT = TD_DW_CONTRAT.ID_UNQ_CONT(+)
    AND TD_DW_SINISTRE.ID_UNQ_ROL_ASS = TD_DW_ROL_ASS.ID_UNQ_ROL_ASS (+)
    AND TD_DW_ROL_ASS.ID_UNQ_GEN_PROD = TD_DW_GEN_PRODUIT.ID_UNQ_GEN_PROD (+)
    et la négation de ces jointures :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    TD_DW_PROV_SIN.ID_UNQ_SIN =
    TD_DW_SINISTRE.ID_UNQ_SIN (+)
    PS : je débute en sql.

  4. #4
    Membre éclairé Avatar de Z3phur
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2007
    Messages
    680
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2007
    Messages : 680
    Points : 807
    Points
    807
    Par défaut
    Bonsoir,

    sans connaitre le fonctionnel, c'est difficile de t'aider, peux-tu nous décrire ce que tu veux?

    Essai d'enlever la partie qui te dérange en faisant une sous requête dans la clause from.

    par exemple :

    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
    SELECT TD_DW_SINISTRE.SOURCE, TD_DW_SINISTRE.ID_CTRTE, 
    TD_DW_SINISTRE.ID_PROD, TD_DW_SINISTRE.ID_OPT, 
    TD_DW_SINISTRE.ID_SOC, TD_DW_SINISTRE.ID_INTERV_DISTRIB, 
    TD_DW_SINISTRE.ID_STRUCT, TD_DW_SINISTRE.TYP_SIN, 
    TD_DW_SINISTRE.DT_PASS_POS_SIN, TD_DW_SINISTRE.ID_UNQ_ROL_ASS, 
    TD_DW_SINISTRE.ID_UNQ_CONT, TD_DW_SINISTRE.TYP_ENREG, 
    TD_DW_ROL_ASS.ID_UNQ_GEN_PROD, TD_DW_GEN_PRODUIT.ID_GEN_PROD, 
    TD_DW_PEC.SOURCE, TD_DW_PEC.TYP_ENREG, TD_DW_PEC.NUM_LOT_DE, 
    TD_DW_CONTRAT.ID_UNQ_INTERV, TD_DW_SINISTRE.PROV_SIN_PROB, 
    TD_DW_PEC.ID_UNQ_PEC, TD_DW_PEC.NUM_DEC, TD_DW_PEC.ID_UNQ_SIN, 
    TD_DW_CONTRAT.DT_SIGN_CONT, TD_DW_PROV_SIN.ID_UNQ_SIN 
    FROM
    TD_DW_SINISTRE, TD_DW_PEC, TD_DW_GEN_PRODUIT, TD_DW_ROL_ASS,
     TD_DW_CONTRAT, TD_DW_PROV_SIN, 
    (select xxx from tes_tables where ...) tmp
    WHERE
    ==========================================
    La justice sans la force est impuissante, la force sans la justice est tyrannique...

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 20
    Points : 16
    Points
    16
    Par défaut
    en fait, ce que je veux c'est ne pas récupérer les id_unq_sin déja présent dans la table TD_DW_PROV_SIN suite à une jointure externe faite dans un premier temps :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    TD_DW_PROV_SIN.ID_UNQ_SIN =
    TD_DW_SINISTRE.ID_UNQ_SIN (+)
    Si je fais cela, est ce que ca pourrait marcher :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT TD_DW_SINISTRE.SOURCE, TD_DW_SINISTRE.ID_CTRTE, TD_DW_SINISTRE.ID_PROD, TD_DW_SINISTRE.ID_OPT, TD_DW_SINISTRE.ID_SOC, TD_DW_SINISTRE.ID_INTERV_DISTRIB, TD_DW_SINISTRE.ID_STRUCT, TD_DW_SINISTRE.TYP_SIN, TD_DW_SINISTRE.DT_PASS_POS_SIN, TD_DW_SINISTRE.ID_UNQ_ROL_ASS, TD_DW_SINISTRE.ID_UNQ_CONT, TD_DW_SINISTRE.TYP_ENREG, TD_DW_ROL_ASS.ID_UNQ_GEN_PROD, TD_DW_GEN_PRODUIT.ID_GEN_PROD, TD_DW_PEC.SOURCE, TD_DW_PEC.TYP_ENREG, TD_DW_PEC.NUM_LOT_DE, TD_DW_CONTRAT.ID_UNQ_INTERV, TD_DW_SINISTRE.PROV_SIN_PROB, TD_DW_PEC.ID_UNQ_PEC, TD_DW_PEC.NUM_DEC, TD_DW_PEC.ID_UNQ_SIN, TD_DW_CONTRAT.DT_SIGN_CONT, TD_DW_PROV_SIN.ID_UNQ_SIN 
    FROM
    TD_DW_SINISTRE, TD_DW_PEC, TD_DW_GEN_PRODUIT, TD_DW_ROL_ASS, TD_DW_CONTRAT, TD_DW_PROV_SIN 
    WHERE
    
    TD_DW_PEC.ID_UNQ_SIN = TD_DW_SINISTRE.ID_UNQ_SIN (+) 
    AND TD_DW_SINISTRE.ID_UNQ_CONT = TD_DW_CONTRAT.ID_UNQ_CONT(+)
    AND TD_DW_SINISTRE.ID_UNQ_ROL_ASS = TD_DW_ROL_ASS.ID_UNQ_ROL_ASS (+)
    AND TD_DW_ROL_ASS.ID_UNQ_GEN_PROD = TD_DW_GEN_PRODUIT.ID_UNQ_GEN_PROD (+)
    AND NOT EXISTS (
    SELECT * FROM TD_DW_SINISTRE, TD_DW_PROV_SIN where TD_DW_PROV_SIN.ID_UNQ_SIN =
    TD_DW_SINISTRE.ID_UNQ_SIN  )

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 20
    Points : 16
    Points
    16
    Par défaut
    Merci pour votre aide

  7. #7
    Membre éclairé Avatar de Z3phur
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2007
    Messages
    680
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2007
    Messages : 680
    Points : 807
    Points
    807
    Par défaut
    Bonjour,

    il faudrait voir du côté de l'utilisation de union ou minus suivant votre cas.
    ==========================================
    La justice sans la force est impuissante, la force sans la justice est tyrannique...

  8. #8
    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
    Il faut commencer par laisser tomber les (+) surtout, et utiliser des alias de table.
    Effectivement NOT EXISTS est une bonne solution :
    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
    SELECT tsn.SOURCE,
           tsn.ID_CTRTE,
           tsn.ID_PROD,
           tsn.ID_OPT,
           tsn.ID_SOC,
           tsn.ID_INTERV_DISTRIB,
           tsn.ID_STRUCT,
           tsn.TYP_SIN,
           tsn.DT_PASS_POS_SIN,
           tsn.ID_UNQ_ROL_ASS,
           tsn.ID_UNQ_CONT,
           tsn.TYP_ENREG,
           tra.ID_UNQ_GEN_PROD,
           tgp.ID_GEN_PROD,
           tpe.SOURCE,
           tpe.TYP_ENREG,
           tpe.NUM_LOT_DE,
           tco.ID_UNQ_INTERV,
           tsn.PROV_SIN_PROB,
           tpe.ID_UNQ_PEC,
           tpe.NUM_DEC,
           tpe.ID_UNQ_SIN,
           tco.DT_SIGN_CONT
      FROM TD_DW_PEC tpe
           LEFT OUTER JOIN TD_DW_SINISTRE tsn
             ON tsn.ID_UNQ_SIN = tpe.ID_UNQ_SIN
           LEFT OUTER JOIN TD_DW_CONTRAT tco
             ON tco.ID_UNQ_CONT = tsn.ID_UNQ_CONT
           LEFT OUTER JOIN TD_DW_ROL_ASS tra
             ON tra.ID_UNQ_ROL_ASS = tsn.ID_UNQ_ROL_ASS
           LEFT OUTER JOIN TD_DW_GEN_PRODUIT tgp
             ON tgp.ID_UNQ_GEN_PROD = tra.ID_UNQ_GEN_PROD
     WHERE NOT EXISTS (SELECT NULL 
                         FROM TD_DW_PROV_SIN tps 
                        WHERE tps.ID_UNQ_SIN = tsn.ID_UNQ_SIN);

Discussions similaires

  1. [Requête] Jointure Externe Totale
    Par alcabk dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 28/09/2006, 14h47
  2. [Access] Probléme simplification requete Jointure Externe
    Par paflolo dans le forum Langage SQL
    Réponses: 6
    Dernier message: 02/03/2006, 10h18
  3. Requete Jointure Externe...Soucis!!
    Par paflolo dans le forum Langage SQL
    Réponses: 2
    Dernier message: 01/03/2006, 11h25
  4. [requetes / Jointures externes] : expression de jointure
    Par Ptit_boeuf dans le forum Langage SQL
    Réponses: 5
    Dernier message: 28/07/2005, 16h42
  5. [Requete] jointure externe -> where
    Par MrDuChnok dans le forum Langage SQL
    Réponses: 12
    Dernier message: 12/07/2004, 15h48

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