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 :

Jointure interne


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 47
    Points : 22
    Points
    22
    Par défaut Jointure interne
    bonjour,

    je voudrais effectuer une requete sur 2 tables avec un jointure interne.
    voici le schema de mes 2 tables :

    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
     
    Table ELP_GRILLE
     Name                 Null?          Type
     -----------------     --------      ----
    COD_ANN              NOT NULL  VARCHAR2(4)
     COD_ELP             NOT NULL   VARCHAR2(10)
     COD_SCC                             VARCHAR2(4)
     COD_PEL             NOT NULL   VARCHAR2(2)
     COD_CMP            NOT NULL   VARCHAR2(4)
     LIC_ELP                                VARCHAR2(25)
     LIB_ELP                                 VARCHAR2(60)
     NOM_RESP_ELP                      VARCHAR2(40)
     NBR_VOL_ELP                         NUMBER(6,2)
     NBR_GRP_CM_ORI                  NUMBER(2)
     NBR_GRP_CM_MOD                 NUMBER(2)
     NBR_GRP_CM_REEL                 NUMBER(2)
     NBR_GRP_TD_ORI                   NUMBER(2)
     NBR_GRP_TD_MOD                  NUMBER(2)
     NBR_GRP_TD_REEL                  NUMBER(2)
     NBR_GRP_TP_ORI                    NUMBER(2)
     NBR_GRP_TP_MOD                   NUMBER(2)
     NBR_GRP_TP_REEL                   NUMBER(2)
     NBR_HEU_CM_ELP                    NUMBER(4)
     NBR_HEU_TD_ELP                     NUMBER(4)
     NBR_HEU_TP_ELP                     NUMBER(4)
     COMMENT_ELP                         VARCHAR2(2000)
     TEM_SUS_ELP                          VARCHAR2(1)
     DAT_CRE_ELP                           DATE
     DAT_MOD_ELP                          DATE
    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
     
    Table ELEMENT_PEDAGOGI
    Name                 Null?          Type
     -----------------     --------      ----
    COD_ELP             NOT NULL   VARCHAR2(10)
     COD_SCC                             VARCHAR2(4)
     COD_PEL             NOT NULL   VARCHAR2(2)
     COD_CMP            NOT NULL   VARCHAR2(4)
     LIC_ELP                                VARCHAR2(25)
     LIB_ELP                                 VARCHAR2(60)
     NBR_VOL_ELP                         NUMBER(6,2)
     NBR_HEU_CM_ELP                    NUMBER(4)
     NBR_HEU_TD_ELP                     NUMBER(4)
     NBR_HEU_TP_ELP                     NUMBER(4)
     LIB_CMT_ELP                         VARCHAR2(2000)
     TEM_SUS_ELP                          VARCHAR2(1)
    mon besoin est de rapatrier la table ELEMENT_PEDAGOGI ( situee sur une uatre base avec lien DB_LINK ) dans la table ELP_GRILLE en fonction de certains criteres.

    ma requete concerne la verification des champs entre les tables, afin d'effectuer une MAJ de la table ELP_GRILLE si un des champs de la table
    ELEMENT_PEDAGOGI à changer.

    voici le code de ma requete.


    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
     
    SELECT DISTINCT (Elp.Cod_Elp), 
    	Elp.Cod_Scc, 
    	Elp.Cod_Pel, 
    	Elp.Lic_Elp, 
    	Elp.Lib_Elp, 
    	Elp.Nbr_Vol_Elp, 
    	Elp.Nbr_Heu_Cm_Elp, 
    	Elp.Nbr_Heu_Td_Elp,
    	Elp.Nbr_Heu_Tp_Elp, 
    	Elp.Lib_Cmt_Elp, 
    	Elp.Tem_Sus_Elp
    	FROM Elp_Grille Gri, a_Element_Pedagogi Elp
    	WHERE Gri.Cod_Elp = Elp.Cod_Elp
    	AND Gri.Cod_Ann = '2004'
    	AND Gri.Tem_Sus_Elp <> Elp.Tem_Sus_Elp
    	AND (Gri.Lic_Elp <> Elp.Lic_Elp 
    	OR Gri.Lib_Elp <> Elp.Lib_Elp 
    	OR Gri.Nbr_Vol_Elp <> Elp.Nbr_Vol_Elp 
    	OR Gri.Nbr_Heu_Cm_Elp <> Elp.Nbr_Heu_Cm_Elp 
    	OR Gri.Nbr_Heu_Td_Elp <> Elp.Nbr_Heu_Td_Elp 
    	OR Gri.Nbr_Heu_Tp_Elp <> Elp.Nbr_Heu_Tp_Elp 
    	OR Gri.Comment_Elp <> Elp.Lib_Cmt_Elp 
    	OR Gri.Tem_Sus_Elp <> Elp.Tem_Sus_Elp) ;
    je resultat sans les test de champs est ok, mais des que je test la non equivalence entre 2 champs, j'ai :
    soit aune projection si je les met entre ()
    soit le produit cartesien des 2 tables

    je sais ca à l'air facil comme ca.
    si quelqu'un a une solution et surtout une explication, ca m'arrangerai beaucoup

    merci

  2. #2
    Membre émérite Avatar de vttman
    Homme Profil pro
    Développeur "couteau mosellan"
    Inscrit en
    Décembre 2002
    Messages
    1 140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur "couteau mosellan"
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 140
    Points : 2 286
    Points
    2 286
    Par défaut Re: Jointure interne
    Citation Envoyé par de LANFRANCHI
    bonjour,

    je voudrais effectuer une requete sur 2 tables avec un jointure interne.
    voici le schema de mes 2 tables :

    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
     
    Table ELP_GRILLE
     Name                 Null?          Type
     -----------------     --------      ----
    COD_ANN              NOT NULL  VARCHAR2(4)
     COD_ELP             NOT NULL   VARCHAR2(10)
     COD_SCC                             VARCHAR2(4)
     COD_PEL             NOT NULL   VARCHAR2(2)
     COD_CMP            NOT NULL   VARCHAR2(4)
     LIC_ELP                                VARCHAR2(25)
     LIB_ELP                                 VARCHAR2(60)
     NOM_RESP_ELP                      VARCHAR2(40)
     NBR_VOL_ELP                         NUMBER(6,2)
     NBR_GRP_CM_ORI                  NUMBER(2)
     NBR_GRP_CM_MOD                 NUMBER(2)
     NBR_GRP_CM_REEL                 NUMBER(2)
     NBR_GRP_TD_ORI                   NUMBER(2)
     NBR_GRP_TD_MOD                  NUMBER(2)
     NBR_GRP_TD_REEL                  NUMBER(2)
     NBR_GRP_TP_ORI                    NUMBER(2)
     NBR_GRP_TP_MOD                   NUMBER(2)
     NBR_GRP_TP_REEL                   NUMBER(2)
     NBR_HEU_CM_ELP                    NUMBER(4)
     NBR_HEU_TD_ELP                     NUMBER(4)
     NBR_HEU_TP_ELP                     NUMBER(4)
     COMMENT_ELP                         VARCHAR2(2000)
     TEM_SUS_ELP                          VARCHAR2(1)
     DAT_CRE_ELP                           DATE
     DAT_MOD_ELP                          DATE
    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
     
    Table ELEMENT_PEDAGOGI
    Name                 Null?          Type
     -----------------     --------      ----
    COD_ELP             NOT NULL   VARCHAR2(10)
     COD_SCC                             VARCHAR2(4)
     COD_PEL             NOT NULL   VARCHAR2(2)
     COD_CMP            NOT NULL   VARCHAR2(4)
     LIC_ELP                                VARCHAR2(25)
     LIB_ELP                                 VARCHAR2(60)
     NBR_VOL_ELP                         NUMBER(6,2)
     NBR_HEU_CM_ELP                    NUMBER(4)
     NBR_HEU_TD_ELP                     NUMBER(4)
     NBR_HEU_TP_ELP                     NUMBER(4)
     LIB_CMT_ELP                         VARCHAR2(2000)
     TEM_SUS_ELP                          VARCHAR2(1)
    mon besoin est de rapatrier la table ELEMENT_PEDAGOGI ( situee sur une uatre base avec lien DB_LINK ) dans la table ELP_GRILLE en fonction de certains criteres.

    ma requete concerne la verification des champs entre les tables, afin d'effectuer une MAJ de la table ELP_GRILLE si un des champs de la table
    ELEMENT_PEDAGOGI à changer.

    voici le code de ma requete.


    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
     
    SELECT DISTINCT (Elp.Cod_Elp), 
    	Elp.Cod_Scc, 
    	Elp.Cod_Pel, 
    	Elp.Lic_Elp, 
    	Elp.Lib_Elp, 
    	Elp.Nbr_Vol_Elp, 
    	Elp.Nbr_Heu_Cm_Elp, 
    	Elp.Nbr_Heu_Td_Elp,
    	Elp.Nbr_Heu_Tp_Elp, 
    	Elp.Lib_Cmt_Elp, 
    	Elp.Tem_Sus_Elp
    	FROM Elp_Grille Gri, a_Element_Pedagogi Elp
    	WHERE Gri.Cod_Elp = Elp.Cod_Elp
    	AND Gri.Cod_Ann = '2004'
    	AND Gri.Tem_Sus_Elp <> Elp.Tem_Sus_Elp
    	AND (Gri.Lic_Elp <> Elp.Lic_Elp 
    	OR Gri.Lib_Elp <> Elp.Lib_Elp 
    	OR Gri.Nbr_Vol_Elp <> Elp.Nbr_Vol_Elp 
    	OR Gri.Nbr_Heu_Cm_Elp <> Elp.Nbr_Heu_Cm_Elp 
    	OR Gri.Nbr_Heu_Td_Elp <> Elp.Nbr_Heu_Td_Elp 
    	OR Gri.Nbr_Heu_Tp_Elp <> Elp.Nbr_Heu_Tp_Elp 
    	OR Gri.Comment_Elp <> Elp.Lib_Cmt_Elp 
    	OR Gri.Tem_Sus_Elp <> Elp.Tem_Sus_Elp) ;
    je resultat sans les test de champs est ok, mais des que je test la non equivalence entre 2 champs, j'ai :
    soit aune projection si je les met entre ()
    soit le produit cartesien des 2 tables

    je sais ca à l'air facil comme ca.
    si quelqu'un a une solution et surtout une explication, ca m'arrangerai beaucoup

    merci
    Pour faire un jointure correcte entre 2 tables, il faut déjà
    avoir une bonne jointure sur les clés de ces 2 tables

    Donc pour Table ELP_GRILLE, si la clé est
    COD_ANN NOT NULL VARCHAR2(4)
    COD_ELP NOT NULL VARCHAR2(10)
    COD_SCC VARCHAR2(4)
    COD_PEL NOT NULL VARCHAR2(2)
    COD_CMP NOT NULL VARCHAR2(4)

    et si pour Table ELEMENT_PEDAGOGI, la clé est
    COD_ELP NOT NULL VARCHAR2(10)
    COD_SCC VARCHAR2(4)
    COD_PEL NOT NULL VARCHAR2(2)
    COD_CMP NOT NULL VARCHAR2(4)

    il faut déjà niveau requête l'indiquer ainsi
    =>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
                 ...
    	FROM Elp_Grille Gri, a_Element_Pedagogi Elp
    	WHERE 
    	Gri.Cod_Ann = '2004' 
                    and Gri.Cod_Elp = Elp.Cod_Elp 
                    and Gri.Cod_scc = Elp.Cod_scc 
                    and Gri.Cod_pel = Elp.Cod_pel 
                    and Gri.Cod_cmp = Elp.Cod_cmp
                           ...
    Sinon produit cartesien assuré

  3. #3
    Tan
    Tan est déconnecté
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 168
    Points : 158
    Points
    158
    Par défaut
    vttman: Pas la peine de citer toutes la question, elle est au-dessus.
    Pour une jointure interne utilises plutôt les INNER JOIN, c'est plus efficace que de tout mettre dans la clause WHERE

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 47
    Points : 22
    Points
    22
    Par défaut
    la cle commune entre ces 2 tables est
    Cod_Elp

    les autres COD_ sont des cles portant sur d'autres tables n'ayant rien avoir avec la jointure.

    j'ai omis de le preciser.

  5. #5
    Membre émérite Avatar de vttman
    Homme Profil pro
    Développeur "couteau mosellan"
    Inscrit en
    Décembre 2002
    Messages
    1 140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur "couteau mosellan"
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 140
    Points : 2 286
    Points
    2 286
    Par défaut
    Citation Envoyé par Tan
    vttman: Pas la peine de citer toutes la question, elle est au-dessus.
    Pour une jointure interne utilises plutôt les INNER JOIN, c'est plus efficace que de tout mettre dans la clause WHERE
    +1

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 47
    Points : 22
    Points
    22
    Par défaut
    malheureusement je suis sous oracle 8i qui ne supporte pas les syntaxes du JOIN.

  7. #7
    Membre émérite Avatar de vttman
    Homme Profil pro
    Développeur "couteau mosellan"
    Inscrit en
    Décembre 2002
    Messages
    1 140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur "couteau mosellan"
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 140
    Points : 2 286
    Points
    2 286
    Par défaut
    Serait-il possible d'avoir un jeu d'essai
    (qques enregistrements sur les 2 tables)
    et le resultat escompté
    pour avancer sur ce problème ?

  8. #8
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    A part qu'il y a 2 fois la condition : AND Gri.Tem_Sus_Elp <> Elp.Tem_Sus_Elp

    je la trouve très bien cette requête... j'vois pas comment il peut y avoir de produit cartésien là dedans , tu as un exemple d'EXPLAIN PLAN qui t'indique le produit cartésien ?

    PS : pourquoi ne pas avoir posté dans le forum Oracle ?

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 47
    Points : 22
    Points
    22
    Par défaut
    j'ai eu la reponse dans le forum oracle

    Alors le probléme vient du fait que la 3° colonnes est NULL... donc la comparaison ne fonctionne pas Wink

    Voila comment faire :

    Code:
    select g.cod_elp , a.tem_sus_elp as tem_gri, g.tem_sus_elp as tem_apo
    from elp_grille g, a_element_pedagogi a
    where g.cod_elp = a.cod_elp
    and NVL(a.tem_sus_elp,g.tem_sus_elp||'*') <> NVL(g.tem_sus_elp,a.tem_sus_elp||'*');


    Si une des colonnes est NULL tu considéres qu'elle est égale à la colonne que tu compares concaténée avec * (pour que la comparaison montre bien la différence).

    PS : A noter que a et b ne sont pas ni égaux ni différent si ils sont NULL aussi Wink
    La comparaison d'une valeur avec NULL retournera toujours FAUX...

    Essaye :
    Code:
    SELECT sysdate FROM dual WHERE NULL <> 1;
    SELECT sysdate FROM dual WHERE NULL = 1;
    SELECT sysdate FROM dual WHERE NULL = NULL;
    SELECT sysdate FROM dual WHERE NULL <> NULL;


    Aucune ligne ne sera sélectionnée quelque soit la reqûete Smile
    merci à tous

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

Discussions similaires

  1. Opérateur (+) = et jointure interne
    Par al1_24 dans le forum SQL
    Réponses: 2
    Dernier message: 31/03/2008, 18h42
  2. Requête mise à jour avec jointure interne
    Par joquetino dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 16/01/2008, 17h41
  3. [1.3.3] DataSet et jointure interne
    Par lazarel dans le forum iReport
    Réponses: 0
    Dernier message: 25/07/2007, 15h15
  4. sum() dans une jointure interne
    Par xenos dans le forum Langage SQL
    Réponses: 2
    Dernier message: 20/07/2007, 17h42
  5. Jointure interne mysql
    Par egho6235 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 05/04/2007, 17h29

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