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 :

Select .. inner join sur plusieurs tables


Sujet :

Langage SQL

  1. #1
    Candidat au Club
    Femme Profil pro
    Analyste d'exploitation
    Inscrit en
    Janvier 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Analyste d'exploitation

    Informations forums :
    Inscription : Janvier 2015
    Messages : 6
    Points : 3
    Points
    3
    Par défaut Select .. inner join sur plusieurs tables
    Bonsoir,

    j'ai 2 tables (réduites aux colonnes utilisées dans l'exemple), et le résultat attendu

    Pièce jointe 165619




    Voici la requête que j'ai écrite, mais, elle ne fonctionne pas. j'ai un doublon
    Code sql : 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 T1.id_pers,
         T1.code_sal,
        T2b.cal
        from Table1 T1
        inner join
        (
          select Max(date_cal) max_date_cal,id_pers
          from Table2 where date_cal <= to_date('02/12/2015','DD/MM/YYYY')
              group by id_pers
       ) T2
       on T1.id_pers = T2.id_pers
     inner join
     (
     select Max(date_code) max_date_code, id_pers
     from Table1 where date_code <= to_date('02/12/2015','DD/MM/YYYY')
     group by id_pers
     ) T3
     On T1.id_pers = T3.id_pers
     inner join Table2 T2b on T2.id_pers =T2b.id_pers and T2b.date_cal=max_date_cal
     inner join Table1 T1b on T3.id_pers =T1b.id_pers and T1b.date_code=max_date_code
     where T1.id_pers in (15,35)
     group by T1.id_pers, T1.code_sal, T2b.cal

    Avez-vous une idée?

    D'avance, merci

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 133
    Points : 38 556
    Points
    38 556
    Billets dans le blog
    9
    Par défaut
    "j'ai un doublon" c'est à dire SQLCODE -811 ?
    Si c'est le cas, soit n'importe lequel des résultats est acceptable, auquel cas la clause fetch first one row only évite le -811,
    soit il faut choisir parmi les résultats, auquel cas il faut passer par un curseur, puis choisir parmi les éléments sélectionnés.

    Ps : je n'ai pas pu ouvrir la pièce jointe

  3. #3
    Candidat au Club
    Femme Profil pro
    Analyste d'exploitation
    Inscrit en
    Janvier 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Analyste d'exploitation

    Informations forums :
    Inscription : Janvier 2015
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Bonjour,

    oups voici la pièce jointe
    Images attachées Images attachées  

  4. #4
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Non, pas de curseur, c'est contre performant et inutile ici.
    Par rapport à la requete présentée, il semble manquant une condition sur la date max dans la jointure (ou en fait, je pense qu'il y a des jointures en trop, mais je n'arrive pas a comprendre la logique de la requete).

    Cependant, il pourrait en effet être judicieux ici de se tourner vers les fonctions analytique de classement (comme par exemple ROW_NUMBER()) afin de ne garder que la ligne voulue.

  5. #5
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 133
    Points : 38 556
    Points
    38 556
    Billets dans le blog
    9
    Par défaut
    Je ne comprenais pas non plus la requête, vu que la pièce jointe était inaccessible, et faute de comprendre le but à atteindre, difficile de savoir si un curseur est utile ou non

    Maintenant que je vois la PJ c'est beaucoup plus simple, il suffit de coder :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
       select TAB1.ID_Pers,
              TAB1.Code_Sal,
              TAB1.Date_Code,
              TAB2.Cal,
              TAB2.Date_Cal
       from   Table1 as TAB1
       inner join  Table2 as TAB2
          on TAB2.ID_Pers =TAB1.ID_Pers
         and TAB2.Code_Sal=TAB1.Code_Sal
       where TAB1.Date_Code = 
            (select max(Date_Code) from Table1 as SUBQ
             where subq.Id_Pers = TAB1.ID_Pers)

  6. #6
    Candidat au Club
    Femme Profil pro
    Analyste d'exploitation
    Inscrit en
    Janvier 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Analyste d'exploitation

    Informations forums :
    Inscription : Janvier 2015
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    ...TAB2.Code_Sal n'existe pas ...

    un peu d'explication

    le principe:
    dans table1, un user possède un ou plusieurs code_sal, chacun associé à une date
    dans table2, ce même user possède un ou plusieurs cal, chacun associé à une date

    je dois récupérer- à une date passée en paramètre (d'où l'utilisation de max(date) dans la requête)- la dernière situation de ce user ....

    une sélection sur chaque table fonctionne renvoi le résultat attendu
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select Max(date_cal) max_date_cal,id_pers,cal
          from Table2 where date_cal <= to_date('02/12/2015','DD/MM/YYYY') and id_pers in (15,35)
              group by id_pers,cal

    ça coince dès que j'ajoute le second inner join .....

  7. #7
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 133
    Points : 38 556
    Points
    38 556
    Billets dans le blog
    9
    Par défaut
    Pardon j'avais mal lu le titre de la colonne,

    Dans ce cas, ça donne
    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
     
       select TAB1.ID_Pers,
              TAB1.Code_Sal,
              TAB1.Date_Code,
              TAB2.Cal,
              TAB2.Date_Cal
       from   Table1 as TAB1
       inner join  Table2 as TAB2
          on TAB2.ID_Pers =TAB1.ID_Pers
       where TAB1.Date_Code = 
            (select max(Date_Code) from Table1 as SUB1
             where SUB1.Id_Pers = TAB1.ID_Pers) 
         and TAB2.Date_Cal =
            (Select max(Date_Cal)  from Table2 as SUB2
             where SUB2.Id_Pers = TAB2.Id_Pers)

  8. #8
    Candidat au Club
    Femme Profil pro
    Analyste d'exploitation
    Inscrit en
    Janvier 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Analyste d'exploitation

    Informations forums :
    Inscription : Janvier 2015
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    j'ai ajouté un "distinct" et ça marche : j'obtiens une ligne par user avec les infos voulues.
    merci beaucoup

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

Discussions similaires

  1. [MySQL-5.5] Syntaxe INNER JOIN sur même table
    Par salent9 dans le forum Requêtes
    Réponses: 2
    Dernier message: 18/06/2014, 08h49
  2. INNER JOIN sur un table si les données existent
    Par Anduriel dans le forum Langage SQL
    Réponses: 6
    Dernier message: 05/07/2012, 14h50
  3. requete sur plusieurs tables sans inner join?
    Par polo86 dans le forum Requêtes
    Réponses: 2
    Dernier message: 02/04/2009, 15h10
  4. inner join sur 3 Tables
    Par faressam dans le forum Développement
    Réponses: 3
    Dernier message: 22/04/2008, 14h23
  5. deux inner join sur une table
    Par the-player777 dans le forum Requêtes
    Réponses: 2
    Dernier message: 05/11/2007, 09h43

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