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 :

réécriture jointure externe


Sujet :

Langage SQL

  1. #1
    Membre habitué
    Avatar de jolatouf
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    170
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 170
    Points : 189
    Points
    189
    Par défaut réécriture jointure externe
    Bonjour,

    J'ai une requête à réécrire avec des Left outer join car l'interpréteur reste dans la panade.

    Voici la 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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
     
     
    insert into   IOC_EXTR_ALM_TRA  
     select   
           Tranche.COD_TCE  as  Code_tranche,  
           Contrat.COD_CON  as  Code_contrat,  
           isnull(UFO_Negociatrice.COD_UFO,'XXX')  as  Code_UFO_Negociatrice,  
           isnull(UFO_Negociatrice.LIB_UFO,'Generic Deal Risk Unit')  as  Libelle_UFO_Negociatrice,  
           isnull(RAF_Emprunteur.COD_RAF,'')  as  Code_RAF_Emprunteur,  
           isnull(RAF_Emprunteur.COD_DXT,'')  as  Code_DXT_Emprunteur,  
           isnull(RAF_Emprunteur.LIB_LON_RAF,'')  as  Libelle_long_RAF_Emprunteur,  
           isnull(Portefeuille_commercial.COD_POR_COM,'')  as  Code_portefeuille_commercial,  
           isnull(Portefeuille_commercial.LIB_POR_COM,'')  as  c9,  
           isnull(Contrat.TYP_CRE_FIN,'')  as  Type_de_credit_financier,  
           isnull(Produit_technique.COD_PRD_TEC,'')  as  Code_produit_technique,  
           isnull(Produit_technique.LIB_CRT_PRD_TEC,'')  as  c12,  
           isnull(Produit_technique.LIB_LON_PRD_TEC,'')  as  c13,  
           isnull(Produit_technique.LIB_MNE_PRD_TEC,'')  as  c14,  
           isnull(T7.COD_FAM_PRD_TEC,'')  as  c15,  
           isnull(T7.LIB_FAM_PRD_TEC,'')  as  c16,  
           isnull(Nature_de_credit.COD_NAT_CRD,'')  as  Code_nature_de_credit,  
           isnull(Nature_de_credit.LIB_NAT_CRD,'')  as  Libelle_nature_de_credit,  
           isnull(Coeur_de_produits_techniques.COD_COE_PRD_TEC,'')  as  c19,  
           isnull(Coeur_de_produits_techniques.LIB_CRT_COE_PRD_TEC,'')  as  c20,  
           isnull(Coeur_de_produits_techniques.LIB_LON_COE_PRD_TEC,'')  as  c21,  
           isnull(T10.COD_RGP,'')  as  Code_regroupement_de_coeurs,  
           isnull(T10.LIB_RGP,'')  as  c23,  
           isnull(convert(char(10),Tranche.DAT_COM_ENG ,112),'')   as  Date_accord_commercial,  
           isnull(convert(char(10),Tranche.DAT_DEB_TCE ,112),'')  as  Date_debut_tranche,  
           isnull(convert(char(10),Tranche.DAT_FIN_TCE ,112),'')  as  Date_fin_tranche,  
           isnull(Devise.COD_DEV,'')  as  Code_devise,  
           convert(decimal(20,3),isnull(SUM(Encours.ENG_INI ),0.0))  as  Engagement_initial,  
           convert(decimal(20,3),isnull(SUM(Encours.ENC_NTI),0.0))  as  Encours_hors_bilan,  
           convert(decimal(20,3),isnull(SUM(Encours.ENC_TIR),0.0))  as  Encours_bilan,  
           convert(decimal(20,3),isnull(SUM(Encours.ENC_TIR_EXI),0.0))  as  Encours_bilan_exigible,  
           convert(decimal(20,3),isnull(SUM(Encours.ENC_TOT),0.0))  as  Encours_total,  
           convert(decimal(20,3),isnull(SUM(Encours.CPT_CLI),0.0))  as  Solde_compte_client  
      from  DIM_POR_COM Portefeuille_commercial , 
            DIM_RAF RAF_Emprunteur, 
            FAI_ENC Encours, 
            DIM_DAT Date_ , 
            DIM_DEV Devise, 
            DIM_TCE Tranche, 
            DIM_CON Contrat, 
            DIM_COE_PRD_TEC Coeur_de_produits_techniques, 
            DIM_PRD Produit_technique, 
            DIM_FAM_PRD_TEC T7, 
            DIM_NAT_CRD Nature_de_credit, 
            GRP_COE_PRD_TEC T10, 
            DIM_UFO UFO_Negociatrice 
    where Portefeuille_commercial.COD_POR_COM =* RAF_Emprunteur.COD_POR_COM 
           and Coeur_de_produits_techniques.COD_COE_PRD_TEC =* Produit_technique.COD_COE_PRD_TEC 
           and T7.COD_FAM_PRD_TEC =* Produit_technique.COD_FAM_PRD_TEC 
           and Nature_de_credit.COD_NAT_CRD =* Produit_technique.COD_NAT_CRD 
           and T10.COD_RGP =* Coeur_de_produits_techniques.COD_RGP 
           and Produit_technique.COD_PRD_TEC =* Encours.COD_PRD_TEC 
           and UFO_Negociatrice.COD_UFO =* Encours.COD_UFO 
           and RAF_Emprunteur.COD_RAF =* Encours.COD_RAF 
           and Date_.COD_DAT = Encours.COD_DAT 
           and (Devise.COD_DAT = Encours.COD_DAT) and (Devise.COD_DEV = Encours.COD_DEV) 
           and Encours.COD_TCE = Tranche.COD_TCE 
           and Contrat.COD_CON = Tranche.COD_CON 
           and     Date_.COD_DAT = '20081009'   
     group by   
           Tranche.COD_TCE,  
           Contrat.COD_CON,  
           UFO_Negociatrice.COD_UFO,  
           UFO_Negociatrice.LIB_UFO,  
           RAF_Emprunteur.COD_RAF,  
           RAF_Emprunteur.COD_DXT,  
           RAF_Emprunteur.LIB_LON_RAF,  
           Portefeuille_commercial.COD_POR_COM,  
           Portefeuille_commercial.LIB_POR_COM,  
           Contrat.TYP_CRE_FIN,  
           Produit_technique.COD_PRD_TEC,  
           Produit_technique.LIB_CRT_PRD_TEC,  
           Produit_technique.LIB_LON_PRD_TEC,  
           Produit_technique.LIB_MNE_PRD_TEC,  
           T7.COD_FAM_PRD_TEC,  
           T7.LIB_FAM_PRD_TEC,  
           Nature_de_credit.COD_NAT_CRD,  
           Nature_de_credit.LIB_NAT_CRD,  
           Coeur_de_produits_techniques.COD_COE_PRD_TEC,  
           Coeur_de_produits_techniques.LIB_CRT_COE_PRD_TEC,  
           Coeur_de_produits_techniques.LIB_LON_COE_PRD_TEC,  
           T10.COD_RGP,  
           T10.LIB_RGP,  
           Tranche.DAT_COM_ENG,  
           Tranche.DAT_DEB_TCE,  
           Tranche.DAT_FIN_TCE,  
           Devise.COD_DEV
    Pourriez-vous me donner un début je ne vois pas par quelle table commencer mes jointures.

    Merci

  2. #2
    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,

    et bien il faut commencer par la 1ère table
    plus sérieusement, qu'est ce qui te gène?

  3. #3
    Membre habitué
    Avatar de jolatouf
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    170
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 170
    Points : 189
    Points
    189
    Par défaut
    Bonjour,

    En fait je compte faire quelque chose du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     FROM (( DIM_POR_COM Portefeuille_commercial 
              left outer join   DIM_RAF RAF_Emprunteur on 
    Portefeuille_commercial.COD_POR_COM = RAF_Emprunteur.COD_POR_COM )
    left outer join ... )
    where ...
    sauf qu'une fois que j'ai réalisé cela je ne voit pas comment faire la suivante.

  4. #4
    Membre habitué
    Avatar de jolatouf
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    170
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 170
    Points : 189
    Points
    189
    Par défaut
    Peut-on faire quelque chose du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    from (table 1 left outer join table 2 on tab1.a=tab2.a) ,
             (table 3 left outer join table 4 on tab3.a=tab4.a)

  5. #5
    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,

    je te donne un petit exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT ...
    FROM  DIM_POR_COM Portefeuille_commercial , 
            DIM_RAF RAF_Emprunteur, 
            FAI_ENC Encours
    WHERE Portefeuille_commercial.COD_POR_COM =* RAF_Emprunteur.COD_POR_COM
    AND RAF_Emprunteur.COD_RAF =* Encours.COD_RAF
    ....
    devient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT ...
    FROM  DIM_POR_COM Portefeuille_commercial 
    LEFT OUTER JOINDIM_RAF RAF_Emprunteur
    ON Portefeuille_commercial.COD_POR_COM =RAF_Emprunteur.COD_POR_COM
    LEFT OUTER JOIN FAI_ENC Encours 
    ON RAF_Emprunteur.COD_RAF =* Encours.COD_RAF
     
    ....
    Donc pas besoin de parenthèses

  6. #6
    Membre habitué
    Avatar de jolatouf
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    170
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 170
    Points : 189
    Points
    189
    Par défaut
    ok merci

    Je vais essayer de me dépatouiller avec çà.

    Je reviendrai plus tard si besoin.

    Merci de ton aide.

  7. #7
    Membre habitué
    Avatar de jolatouf
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    170
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 170
    Points : 189
    Points
    189
    Par défaut
    Voici la requête réécrite

    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
     
    select ...
     from  DIM_POR_COM Portefeuille_commercial 
    LEFT OUTER JOIN DIM_RAF RAF_Emprunteur
    ON Portefeuille_commercial.COD_POR_COM =RAF_Emprunteur.COD_POR_COM
    LEFT OUTER JOIN FAI_ENC Encours 
    ON RAF_Emprunteur.COD_RAF = Encours.COD_RAF
    LEFT OUTER JOIN DIM_UFO UFO_Negociatrice
    ON UFO_Negociatrice.COD_UFO = Encours.COD_UFO
    LEFT OUTER JOIN DIM_PRD Produit_technique
    ON Produit_technique.COD_PRD_TEC = Encours.COD_PRD_TEC
    LEFT OUTER JOIN DIM_COE_PRD_TEC Coeur_de_produits_techniques
    ON Coeur_de_produits_techniques.COD_COE_PRD_TEC = Produit_technique.COD_COE_PRD_TEC
    LEFT OUTER JOIN DIM_FAM_PRD_TEC T7
    ON T7.COD_FAM_PRD_TEC = Produit_technique.COD_FAM_PRD_TEC
    LEFT OUTER JOIN DIM_NAT_CRD Nature_de_credit
    ON Nature_de_credit.COD_NAT_CRD = Produit_technique.COD_NAT_CRD
    LEFT OUTER JOIN GRP_COE_PRD_TEC T10
    ON T10.COD_RGP = Coeur_de_produits_techniques.COD_RGP
    INNER JOIN DIM_DAT Date_ 
    ON Date_.COD_DAT = Encours.COD_DAT 
    INNER JOIN DIM_DEV Devise
    ON (Devise.COD_DAT = Encours.COD_DAT) and (Devise.COD_DEV = Encours.COD_DEV)
    INNER JOIN DIM_TCE Tranche
    ON Encours.COD_TCE = Tranche.COD_TCE 
    INNER JOIN DIM_CON Contrat
    ON Contrat.COD_CON = Tranche.COD_CON
    where  Date_.COD_DAT = '20081009' 
    group by ...
     
     
    where
    Peux-tu me dire si tu vois une erreur dans la retranscription.

    Parceque cette requête doit me renvoyer 150 000 lignes environs et que j'en ai que 130 000.

    Merci de ton aide

  8. #8
    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
    Re,

    tu es sur que toutes tes jointures externes sont à gauche?
    peut être que certaines jointures sont à transcrire à l'aide de RIGHT OUTER JOIN

  9. #9
    Membre habitué
    Avatar de jolatouf
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    170
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 170
    Points : 189
    Points
    189
    Par défaut
    Je pense que oui,

    Sinon la requête ne passerait pas. En fait je pense que la différence vient du group by et du fait que j'ai 2 bases différentes.
    Donc je fait le test sur les 2 bases pour voir le résultat.

    Merci de ton aide qui m'a comme on dit bien aidé

  10. #10
    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
    je te donne un petit exemple

    ce n'est pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LEFT OUTER JOIN DIM_UFO UFO_Negociatrice
    mais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RIGHT OUTER JOIN DIM_UFO UFO_Negociatrice
    la requête passe mais ne fait pas ce qu'elle devrait faire

  11. #11
    Membre expert
    Avatar de cavo789
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2004
    Messages
    1 788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 788
    Points : 3 054
    Points
    3 054
    Par défaut Quelles sont les performances ?
    Petite question en passant : as-tu noté une meilleure performance à la réécriture du SELECT ? Quel était ton objectif en réécrivant le code ?

  12. #12
    Membre habitué
    Avatar de jolatouf
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    170
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 170
    Points : 189
    Points
    189
    Par défaut
    Bonjour,

    Je réécrit cette requête parceque je fait une migration d'une base de donnée SYBASE ASE vers une base de donnée SYBASE IQ.

    La première écriture de la requête ne passant pas sur SYBASE IQ du a un soucis de l'interpreteur pour déterminer un schéma d'éxécution, j'ai réécrit la requête comme montré précédement.

    Cette requête ne me raporte pas le même nombre de ligne car on a identifié un soucis sous "notre" SYBASE ASE sur le regroupement avec des arrondies. Ce qui fait que les données sont corrects et même de meilleurs qualités sous "notre" IQ.

    Pour les performances, sous IQ je peux exécuter la requête, sous ASE la requête ne finis pas. La précédente était plus optimisé pour ASE.

    Voila j'espère avoir répondu à toutes vos attentes.

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

Discussions similaires

  1. [CR9] faire une Jointure externe
    Par coldec dans le forum SAP Crystal Reports
    Réponses: 5
    Dernier message: 28/06/2005, 12h10
  2. Jointure externe compliquée
    Par miniil dans le forum Langage SQL
    Réponses: 9
    Dernier message: 19/02/2004, 09h27
  3. Jointure externe qui ne fonctionne pas
    Par Guizz dans le forum Langage SQL
    Réponses: 3
    Dernier message: 05/02/2004, 12h26
  4. [ jointure externe ] j'y pompe rien
    Par jaimepasteevy dans le forum Langage SQL
    Réponses: 3
    Dernier message: 16/12/2003, 17h57
  5. [Interbase] [Triggers] jointure externe
    Par AnestheziE dans le forum InterBase
    Réponses: 9
    Dernier message: 17/11/2003, 16h17

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