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 :

Requêtes imbriquées et left join


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mars 2011
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2011
    Messages : 30
    Points : 12
    Points
    12
    Par défaut Requêtes imbriquées et left join
    Bonjour à tous,

    Je dois créer une seule et unique requête qui à cette tê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
     
    proc sql;
    create table c1 as (select distinct a1.id_mois, a1.id_tie_mkt, b.MT_CC_CUM_MVT_CRD_REEl_12_M  ,
                                c.MT_CC_CUM_MVT_DBT_REEL_12_M  ,
                                d.MT_CC_IMP_12_M ,
                                e.MT_CC_ENC_12_M ,
                                f.MT_CC_ESC_12_M ,
                                g.MT_CC_FLU_IM_12M
    from (select a.id_mois,a.id_tie_mkt,a.id_ind,(b1.MT_M  + a.MT_M1
          + a.MT_M2 + a.MT_M3 + a.MT_M4 + a.MT_M5 + a.MT_M6 + a.MT_M7 + a.MT_M8 + a.MT_M9 + a.MT_M10 + a.MT_M11 ) as MT_TOT
            from temp.dedoub_step1_500 a,temp.dedoub_step12_500 b1 where
            a.id_tie_mkt=b.id_tie_mkt and a.id_ind=b.id_ind) as a1 ,
            a1 left join (select distinct
            id_mois,id_tie_mkt,MT_tot as MT_CC_CUM_MVT_CRD_REEl_12_M
                           from a1 where id_ind=49) b on a1.id_mois=b.id_mois and a1.id_tie_mkt = b.id_tie_mkt
               left join
                      (select distinct id_mois,id_tie_mkt,MT_tot as MT_CC_CUM_MVT_DBT_REEL_12_M
                      from a1 where id_ind=50) c on a1.id_mois=c.id_mois and a1.id_tie_mkt = c.id_tie_mkt
               left join
                      (select distinct id_mois,id_tie_mkt,MT_tot as MT_CC_IMP_12_M
                      from a1 where id_ind=61) d on a1.id_mois=d.id_mois and a1.id_tie_mkt = d.id_tie_mkt
               left join
                      (select distinct id_mois,id_tie_mkt,MT_tot as MT_CC_ENC_12_M
                      from a1 where id_ind=62) e on a1.id_mois=e.id_mois and a1.id_tie_mkt = e.id_tie_mkt
               left join
                      (select distinct id_mois,id_tie_mkt,MT_tot as MT_CC_ESC_12_M
                      from a1 where id_ind=63) f on a1.id_mois=f.id_mois and a1.id_tie_mkt = f.id_tie_mkt
               left join
                      (select distinct id_mois,id_tie_mkt,MT_tot as MT_CC_FLU_IM_12M
                      from a1 where id_ind=73) g on a1.id_mois=g.id_mois and a1.id_tie_mkt = g.id_tie_mkt );
    quit;
    L'idée est que j'ai une table centrale appelée a1 (1ere sous requête de mon from) à partir de laquelle je créé des requêtes intermédiaires (b,c,d,e,f,g) pour ensuite faire des left join entre ma table a1 et les autres sous requêtes.

    Le problème est que le "pseudo" a1 de ma requête centrale n'est pas reconnue.

    Pourriez vous m'indiquer comment procéder pour que ma requête fonctionne sans avoir a remplacer tous mes "a1" par la requête correspondante ?

    Je vous remercie par avance.

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 102
    Points : 28 392
    Points
    28 392
    Par défaut
    Le problème pourrait se trouver là (lignes 12et 13) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            a.id_tie_mkt=b.id_tie_mkt AND a.id_ind=b.id_ind) AS a1
            LEFT JOIN (SELECT DISTINCT

  3. #3
    Membre à l'essai
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mars 2011
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2011
    Messages : 30
    Points : 12
    Points
    12
    Par défaut
    Bonjour al1_24,

    Pour moi le problème vient plutot de la ligne 15 [from a1 where...].
    les sous requêtes avec cette clause from ne comprennent pas le a1.

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 102
    Points : 28 392
    Points
    28 392
    Par défaut
    En effet, je n'étais pas arrivé jusque là.
    J'ai fonctionné comme un interpréteur, je me suis arrêté à la première erreur.

    Tu n'as pas précisé quel SGBD tu utilises, et sa version, ce qui permettrait de savoir s'il autorise la factorisation de requêtes (WITH ... SELECT)

  5. #5
    Membre à l'essai
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mars 2011
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2011
    Messages : 30
    Points : 12
    Points
    12
    Par défaut
    En effet, je ne l ai pas précisé pck je travaille en SAS Base.
    Mais les requêtes sont executée sur des bases oracle.

    Il me semble avoir vu la fcatorisation de requête sur des Teradata mais jamais sur oracle.

    Si oracle l'accepte peux tu me montrer un exemple ?

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 388
    Points
    18 388
    Par défaut
    Sur Oracle ça existe depuis une dizaine d'année avec la version 9i :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    with tmp as
    (
    select 1 as col from dual
    )
    select col
      from tmp;
     
    COL
    ---
      1

  7. #7
    Membre à l'essai
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mars 2011
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2011
    Messages : 30
    Points : 12
    Points
    12
    Par défaut
    C'est la 8.17...

    Merci

  8. #8
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    En indentant correctement la requête, on y découvre plusieurs erreurs. De plus, les jointures s'écrivent depuis 20 ans avec l'opérateur JOIN ; il serait temps de s'y mettre !

    1ère erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    FROM temp.dedoub_step1_500 a, temp.dedoub_step12_500 b1 
    	WHERE a.id_tie_mkt = b.id_tie_mkt AND a.id_ind=b.id_ind
    Les alias des tables sont a et b1 et la condition de jointure est faite entre a et b !

    2ème erreur juste après :
    À moins que ce soit une auto jointure sur la sous-requête ?
    Voir la remarqué ci-dessus sur les jointures. C'est tellement plus compréhensible de les écrire correctement !

    Euh... finalement, elle est trop horrible cette requête !

    Rien qu'à voir le SELECT, j'ai aussi l'impression qu'il y a un problème au niveau du modèle de données mais comme c'est du SAS, je suppose que travailles sur un jeu de données en entrée de SAS que tu ne peux pas modifier.

    Quel est le but de la requête ? Elle est probablement simplifiable.

Discussions similaires

  1. [AC-2007] Créer une requête imbriquant deux INNER JOIN
    Par Olivier JC dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 09/09/2009, 23h23
  2. requête multi table left join
    Par G4uthier dans le forum Requêtes
    Réponses: 9
    Dernier message: 01/06/2008, 01h21
  3. Lenteur requête avec 17 LEFT JOIN. Comment l'optimiser?
    Par spitou_77 dans le forum Requêtes
    Réponses: 2
    Dernier message: 09/10/2007, 16h44
  4. Imbriquer des LEFT JOIN ?
    Par le_sonic dans le forum Langage SQL
    Réponses: 2
    Dernier message: 25/07/2007, 16h45

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