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 averti
    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
    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 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    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 134
    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
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Membre averti
    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
    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 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    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 134
    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)
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  5. #5
    Membre averti
    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
    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 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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 454
    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 averti
    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
    Par défaut
    C'est la 8.17...

    Merci

  8. #8
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 814
    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 814
    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.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

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