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

SQL Oracle Discussion :

Jointure externe avec "select in"


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Conseil en assistance à maîtrise d'ouvrage
    Inscrit en
    Mars 2012
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Conseil en assistance à maîtrise d'ouvrage
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2012
    Messages : 15
    Par défaut Jointure externe avec "select in"
    Bonjour,

    j'utilise SQL Developper sur une base Oracle.
    j'ai une table de transformateurs électriques et une table de mouvements sur ces transformateurs
    un transformateur peut avoir 0 à n mouvements
    Je veux récupérer l'intégralité de mes transfos, et si le transfo possède au moins un mouvement, récupérer le mouvement le plus récent

    pour joindre mes 2 tables, j'ai fait au plus simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    select
      transfo.CODE, 
      transfo.ANNEE_FABRICATION, 
      transfo.FABRICANT, 
      mvt.code_mouvement, 
      mvt.date_mouvement, 
      mvt.motif_mouvement,
    from E_TRANSFORMATEUR transfo,  e_mouvement_transformateur mvt
    where transfo.id = mvt.e_transformateur(+)
    ça, ça fonctionne.

    mais pour récupérer uniquement le dernier mvt, je voudrais y ajouter cette clause tout en restant sur une jointure externe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    and mvt.date_mouvement 
    in (select max(mvt2.date_mouvement) 
         from e_mouvement_transformateur mvt2 
         where transfo.id = mvt2.e_transformateur )
    Et là je sèche... ou dois-je ajouter le "(+)" ?

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 136
    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 136
    Par défaut
    Si tu utilisais la syntaxe normalisée avec outer join, tu te poserais moins de questions
    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
    SELECT  transfo.CODE 
        ,   transfo.ANNEE_FABRICATION 
        ,   transfo.FABRICANT 
        ,   mvt.code_mouvement 
        ,   mvt.date_mouvement 
        ,   mvt.motif_mouvement
    FROM    E_TRANSFORMATEUR            transfo
        LEFT OUTER JOIN
            e_mouvement_transformateur  mvt
            ON  transfo.id = mvt.e_transformateur
            AND EXISTS
                (   SELECT  NULL
                    FROM    e_mouvement_transformateur mvt2
                    WHERE   mvt.e_transformateur    = mvt2.e_transformateur
                    HAVING  MAX(mvt2.date_mouvement) = mvt.date_mouvement
                )
    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 en assistance à maîtrise d'ouvrage
    Inscrit en
    Mars 2012
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Conseil en assistance à maîtrise d'ouvrage
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2012
    Messages : 15
    Par défaut
    Ah oui, j'y avais pensé...

    mais ma requête finale étant bcp plus complexe, avec d'autres tables jointes, est-ce que je peux intégrer ce outer join entre les 2 table en question et continuer à joindre les autres normalement ?

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 136
    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 136
    Par défaut
    Quand tu dis normalement, tu veux dire conformément à la norme ?

    Tu verras, à l'usage, les requêtes sont beaucoup plus lisibles (donc maintenables) quand on associe les conditions de jointure à la table concernée et qu'on les sépare des conditions de restriction.
    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 en assistance à maîtrise d'ouvrage
    Inscrit en
    Mars 2012
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Conseil en assistance à maîtrise d'ouvrage
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2012
    Messages : 15
    Par défaut
    comme tu as du le comprendre, je ne suis pas un expert SQL...

    quand je dit "normalement" c'est en faisant ce genre de jointure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select xxx
    from table1 a, table2 b
    where a.id_table2 = b.id
    donc si je pouvais faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select xxx
    from table 1a,
    table 2 b,
    table 3 c left outer join table 4 d on(c.id_table4 = d.id) and exists(blabla),
    table 5 e,...etc...

  6. #6
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 136
    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 136
    Par défaut
    Tu peux le faire, mais ce sera beaucoup moins joli que :
    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
    SELECT  xxx
    FROM    TABLE1  a
        INNER JOIN
            TABLE2  b
            ON  b.id  = a.id_table2 
        INNER JOIN
            TABLE3  c 
            ON  c.id  = ?.xxx
        LEFT OUTER JOIN
            TABLE4  d
            ON  d.id  = c.id_table4
            AND EXISTS(blabla)
        INNER JOIN
            TABLE5 e
            ON  e.id = z.xxx
            ...etc...
    WHERE   -- Les conditions qui restent
    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.

Discussions similaires

  1. Pb de jointure externe avec un number
    Par mch_27 dans le forum Oracle
    Réponses: 2
    Dernier message: 07/03/2006, 15h33
  2. [SQL] jointure externe avec 3 tables, comment faire ....
    Par grumbok dans le forum Langage SQL
    Réponses: 2
    Dernier message: 04/08/2005, 16h13
  3. jointure externe avec un where, me pose problème!
    Par Danae dans le forum Langage SQL
    Réponses: 3
    Dernier message: 18/07/2005, 17h37

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