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 :

Problèmes pour INNER JOIN


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2019
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2019
    Messages : 13
    Par défaut Problèmes pour INNER JOIN
    Bonjour à tous

    Je sais que c'est un sujet récurent qui pose beaucoup de problèmes aux débutants en SQL tels que moi, mais j'ai 2 requêtes plutôt basiques (mais longues) qui fonctionnent très bien indépendamment, mais je n'arrive pas du tout à faire l'INNER JOIN entre les 2.

    Ma table contient des interventions pour réaliser une certaine opération (qui a une référence_SP). Pour une opération (une référence_SP quoi), on peut avoir plusieurs interventions

    La première requête extrait des interventions, et plein d'autres infos dont la date de création de cette intervention.

    Pas besoin de vous attarder sur la requête en elle-même, elle fonctionne bien, pas de problème :
    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
     
    SELECT
        ODEON_INTERVENTIONS.INTERVENTIONID,
        ODEON_INTERVENTIONS.REFERENCE_SP,
        ODEON_INTERVENTIONS.ReferenceProjet,
        ODEON_INTERVENTIONS.INTERVENTIONDATECREATION,
        ODEON_INTERVENTIONS.INTERVENTIONETAT,
        ODEON_INTERVENTIONS.INTERVENTIONETATTECHNIQUE,
        ODEON_INTERVENTIONS.INTERVENTIONCARACTERISTIQUES
      FROM
        ODEON_GDIUSER,
        ODEON_INTERVENTIONS,
        ODEON_GDIGROUP
      WHERE
        ( ODEON_GDIGROUP.GROUP_NAME=ODEON_GDIUSER.GROUPEFONCTIONNEL  )
        AND  ( ODEON_INTERVENTIONS.GROUPEINTERVENANT LIKE '%;'||ODEON_GDIGROUP.GROUPID||';%' 
      OR ODEON_INTERVENTIONS.GROUPEPRESTATAIRE LIKE '%;'||ODEON_GDIGROUP.GROUPID||';%'
      OR ODEON_GDIUSER.TYPE='Interne'
        )
        AND  ( ODEON_GDIUSER.LOGIN_NAME=@Variable('BOUSER')  )
        AND  
        (
         ODEON_INTERVENTIONS.INTERVENTIONDATECREATION  >  '08-07-2019 00:00:00'
         AND
         ODEON_INTERVENTIONS.DEMANDEURENTITE  =  'TIBCO'
         AND
         ODEON_INTERVENTIONS.InterventionFamille  =  'TRANS_BB'
         AND
         ODEON_INTERVENTIONS.REFERENCE_SP  LIKE  'A%'
        )

    Ma seconde requête extrait de la même table la même chose, sauf qu'elle extrait uniquement l'intervention la plus récente pour chaque opération (référence_SP).
    Encore une fois, pas besoin de s'attarder sur la requête en elle-même : elle fonctionne bien et me donne ce que j'attends
    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
    SELECT
        ODEON_INTERVENTIONS.REFERENCE_SP,
        MAX(ODEON_INTERVENTIONS.INTERVENTIONDATECREATION) AS maxDate
      FROM
        ODEON_INTERVENTIONS,
        ODEON_GDIUSER,
        ODEON_GDIGROUP
      WHERE
        ( ODEON_GDIGROUP.GROUP_NAME=ODEON_GDIUSER.GROUPEFONCTIONNEL  )
        AND  ( ODEON_INTERVENTIONS.GROUPEINTERVENANT LIKE '%;'||ODEON_GDIGROUP.GROUPID||';%' 
      OR ODEON_INTERVENTIONS.GROUPEPRESTATAIRE LIKE '%;'||ODEON_GDIGROUP.GROUPID||';%'
      OR ODEON_GDIUSER.TYPE='Interne'
        )
        AND  ( ODEON_GDIUSER.LOGIN_NAME=@Variable('BOUSER')  )
        AND  
        (
         ODEON_INTERVENTIONS.INTERVENTIONDATECREATION  >=  '08-07-2019 00:00:00'
         AND
         ODEON_INTERVENTIONS.REFERENCE_SP  LIKE  'A%'
         AND
         ODEON_INTERVENTIONS.DEMANDEURENTITE  IN  ( 'TIBCO'  )
         AND
         ODEON_INTERVENTIONS.InterventionFamille  IN  ( 'TRANS_BB'  )
        )
      GROUP BY ODEON_INTERVENTIONS.REFERENCE_SP
    Le problème est pour faire l'INNER JOIN entre ces 2 requêtes, je m'en trouve bien incapable, pourtant j'en ai déjà fait beaucoup
    Je veux faire la jointure sur la date de création et la réf de l'opération (la première requête prenant toutes les interventions, la seconde ne prenant que la plus récente pour chaque opération)
    J'ai essayé comme ça :
    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
     
    SELECT
        ODEON_INTERVENTIONS.INTERVENTIONID,
        ODEON_INTERVENTIONS.REFERENCE_SP,
        ODEON_INTERVENTIONS.ReferenceProjet,
        ODEON_INTERVENTIONS.INTERVENTIONDATECREATION,
        ODEON_INTERVENTIONS.INTERVENTIONETAT,
        ODEON_INTERVENTIONS.INTERVENTIONETATTECHNIQUE,
        ODEON_INTERVENTIONS.INTERVENTIONCARACTERISTIQUES
      FROM
        ODEON_GDIUSER,
        ODEON_INTERVENTIONS,
        ODEON_GDIGROUP
      WHERE
        ( ODEON_GDIGROUP.GROUP_NAME=ODEON_GDIUSER.GROUPEFONCTIONNEL  )
        AND  ( ODEON_INTERVENTIONS.GROUPEINTERVENANT LIKE '%;'||ODEON_GDIGROUP.GROUPID||';%' 
      OR ODEON_INTERVENTIONS.GROUPEPRESTATAIRE LIKE '%;'||ODEON_GDIGROUP.GROUPID||';%'
      OR ODEON_GDIUSER.TYPE='Interne'
        )
        AND  ( ODEON_GDIUSER.LOGIN_NAME=@Variable('BOUSER')  )
        AND  
        (
         ODEON_INTERVENTIONS.INTERVENTIONDATECREATION  >  '08-07-2019 00:00:00'
         AND
         ODEON_INTERVENTIONS.DEMANDEURENTITE  =  'TIBCO'
         AND
         ODEON_INTERVENTIONS.InterventionFamille  =  'TRANS_BB'
         AND
         ODEON_INTERVENTIONS.REFERENCE_SP  LIKE  'A%'
          )
     
     
    INNER JOIN
     
     
    (SELECT
        ODEON_INTERVENTIONS.REFERENCE_SP,
        MAX(ODEON_INTERVENTIONS.INTERVENTIONDATECREATION) AS maxDate
      FROM
        ODEON_INTERVENTIONS,
        ODEON_GDIUSER,
        ODEON_GDIGROUP
      WHERE
        ( ODEON_GDIGROUP.GROUP_NAME=ODEON_GDIUSER.GROUPEFONCTIONNEL  )
        AND  ( ODEON_INTERVENTIONS.GROUPEINTERVENANT LIKE '%;'||ODEON_GDIGROUP.GROUPID||';%' 
      OR ODEON_INTERVENTIONS.GROUPEPRESTATAIRE LIKE '%;'||ODEON_GDIGROUP.GROUPID||';%'
      OR ODEON_GDIUSER.TYPE='Interne'
        )
        AND  ( ODEON_GDIUSER.LOGIN_NAME=@Variable('BOUSER')  )
        AND  
        ODEON_INTERVENTIONS.INTERVENTIONDATECREATION  >=  '08-07-2019 00:00:00'
      GROUP BY ODEON_INTERVENTIONS.REFERENCE_SP) query2
     
     
    ON ODEON_INTERVENTIONS.REFERENCE_SP = query2.REFERENCE_SP AND ODEON_INTERVENTIONS.INTERVENTIONDATECREATION = query2.maxDate
    Mais je me mange l'erreur ORA-00933: SQL command not properly ended.
    J'imagine donc que le problème vient de ma syntaxe sur la jointure, vu que les requêtes fonctionnent bien séparément... Mais je ne vois pas du tout ce que ça peut être

    Un expert du INNER JOIN saurait-il m'aider ? Je lui en serais très reconnaissant

  2. #2
    Expert confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 455
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 455
    Par défaut
    Bonjour,
    Pour résumer ta commande, tu fais ceci:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    selectfrom ..
    where ..
    inner join () on ..
    Or les jointures se font avant la clause WHERE.

    Ce serait plus évidement si tu utilisais INNER JOIN pour toutes les jointures.

    Tatayo.

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2019
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2019
    Messages : 13
    Par défaut
    Merci pour la réponse rapide !

    Effectivement, ça n'aide pas ! Mais j'utilise un MAX avec GROUP BY dans mon second SELECT, or il me semblait que le WHERE devait être avant le GROUP BY

    GROUP BY irait alors à la fin ? ça me paraît bizarre puisqu'il ne concerne que le second SELECT

  4. #4
    Expert confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 455
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 455
    Par défaut
    Le GROUP-BY est dans une sous-requête, donc il n'intervient pas ici.
    Dans la "synthèse" que j'ai mise dans mon message, il est entre les parenthèses.
    Si tu veux ça donne ceci:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    selectfromwhereinner join (selectfromwheregroup by) on
    Le problème reste le même, tu as une jointure après un WHERE.

    Je te suggère d'utiliser des JOIN pour toutes tes jointures, ça va grandement simplifier la correction de ta requête, en plus de la rendre plus lisible en séparant critères de jointure et critère de filtrage.

    Tatayo.

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2019
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2019
    Messages : 13
    Par défaut
    OK je vois mieux d'où vient le problème, je vais essayer tout ça, merci beaucoup !

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Par défaut
    Bonjour,
    Ta modélisation n'est pas terrible, tu concatennes les données dans GROUPEINTERVENANT et GROUPEPRESTATAIRE, au lieu de faire une table d'association ayant un type. C'est pour cela que tu as du mal à reformuler ta première requete avec des inner join
    Pour en revenir à ton problème, en utilisant une CTE, est-ce que ceci conviendrait.
    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
    With data
    AS
    (
    SELECT
        ODEON_INTERVENTIONS.INTERVENTIONID,
        ODEON_INTERVENTIONS.REFERENCE_SP,
        ODEON_INTERVENTIONS.ReferenceProjet,
        ODEON_INTERVENTIONS.INTERVENTIONDATECREATION,
        ODEON_INTERVENTIONS.INTERVENTIONETAT,
        ODEON_INTERVENTIONS.INTERVENTIONETATTECHNIQUE,
        ODEON_INTERVENTIONS.INTERVENTIONCARACTERISTIQUES
      FROM
        ODEON_GDIUSER,
        ODEON_INTERVENTIONS,
        ODEON_GDIGROUP
      WHERE
        ( ODEON_GDIGROUP.GROUP_NAME=ODEON_GDIUSER.GROUPEFONCTIONNEL  )
        AND  ( ODEON_INTERVENTIONS.GROUPEINTERVENANT LIKE '%;'||ODEON_GDIGROUP.GROUPID||';%' 
      OR ODEON_INTERVENTIONS.GROUPEPRESTATAIRE LIKE '%;'||ODEON_GDIGROUP.GROUPID||';%'
      OR ODEON_GDIUSER.TYPE='Interne'
        )
        AND  ( ODEON_GDIUSER.LOGIN_NAME=@Variable('BOUSER')  )
        AND  
        (
         ODEON_INTERVENTIONS.INTERVENTIONDATECREATION  >  '08-07-2019 00:00:00'
         AND
         ODEON_INTERVENTIONS.DEMANDEURENTITE  =  'TIBCO'
         AND
         ODEON_INTERVENTIONS.InterventionFamille  =  'TRANS_BB'
         AND
         ODEON_INTERVENTIONS.REFERENCE_SP  LIKE  'A%'
        )
     
    )
    Select 
    from data d
    inner join
    (select ODEON_INTERVENTIONS.REFERENCE_SP, MAX(ODEON_INTERVENTIONS.INTERVENTIONDATECREATION) AS maxDate
    from data
    ) as MD
    on d.REFERENCE_SP=MD.REFERENCE_SP
    and D.INTERVENTIONDATECREATION=MD.maxDate
    Data representant ta première requete
    ce qui est aliasé par MD ta deuxième requete.
    Malgré tout, la modélisation est perfectible.
    Cordialement
    Soazig

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

Discussions similaires

  1. [MySQL] Problème avec INNER JOIN
    Par Tee shot dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 13/02/2008, 14h28
  2. Problème avec INNER JOIN
    Par jeanmarc1234 dans le forum Langage SQL
    Réponses: 9
    Dernier message: 14/01/2008, 15h57
  3. Filtre pour inner join
    Par lolotte35 dans le forum Développement de jobs
    Réponses: 1
    Dernier message: 29/10/2007, 10h43
  4. problème requete inner join
    Par maysa dans le forum Langage SQL
    Réponses: 4
    Dernier message: 24/04/2007, 12h48
  5. [Oracle] problème avec INNER JOIN
    Par Philofish dans le forum Langage SQL
    Réponses: 5
    Dernier message: 15/09/2005, 10h20

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