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

Requêtes et SQL. Discussion :

Double Inner Join pour table Codier ? [AC-2003]


Sujet :

Requêtes et SQL.

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2012
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2012
    Messages : 24
    Points : 22
    Points
    22
    Par défaut Double Inner Join pour table Codier ?
    Bonjour !

    J'ai un petit soucis de requête avec une table de codier qui contient les libellés des codes utilisés dans d'autres tables.
    Elle est sous cette forme :
    Table T_CODIER
    CODE_ETAT_DMD
    LIB_ETAT_DMD
    CODE_TYP_DMD
    LIB_TYP_DMD
    (..)
    Et dans la table T_DEMANDE : ETAT_DMD (qui prend les mêmes valeurs que CODE_ETAT_DMD) et TYP_DMD (qui prend les mêmes valeurs que CODE_TYP_DMD)
    J'affiche le résultat dans une liste, cela me donne donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT DT_DMD As Création, T_CODIER.LIB_ETAT_DMD AS État, T_CODIER.LIB_TYP_DMD AS Type, T_DEMANDE.ETAT_DMD, T_CODIER.CODE_ETAT_DMD, T_DEMANDE.TYP_DMD, T_CODIER.CODE_TYP_DMD
    FROM T_CODIER INNER JOIN T_DEMANDE ON T_CODIER.CODE_ETAT_DMD=T_DEMANDE.ETAT_DMD
    WHERE (T_DEMANDE.ETAT_DMD = 0);
    Cette requête est évidemment fausse mais c'est pour me faire comprendre, si je ne demande que l'état avec le inner join, c'est tout bon. Mais j'aimerai avoir le libellé du type aussi. J'ai essayé de faire deux Inner Join mais cela restreint juste le résultat.. Mais je ne vois pas d'autres solutions, il faudrait pouvoir faire un INNER JOIN pour le TYP et pour l'ETAT.
    Y'a t'il un moyen de récupérer les libellés de l'état ET du type en même temps ?
    Désolé si je ne suis pas bien clair mais c'est assez dur à expliquer pour pas grand chose

  2. #2
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2013
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2013
    Messages : 34
    Points : 43
    Points
    43
    Par défaut
    Et dans la table T_DEMANDE : ETAT_DMD (qui prend les mêmes valeurs que CODE_ETAT_DMD) et TYP_DMD (qui prend les mêmes valeurs que CODE_TYP_DMD)
    a)as-tu une table type_dmd ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT c.DT_DMD As Création, c.LIB_ETAT_DMD AS État, c.LIB_TYP_DMD AS Type, c.ETAT_DMD, c.CODE_ETAT_DMD, c.TYP_DMD, c.CODE_TYP_DMD
    FROM T_CODIER c, T_DEMANDE d, T_TYPE_DMD t
    WHERE 1=1
    AND  c.CODE_ETAT_DMD=d.ETAT_DMD
    AND c.CODE_TYPE_DMD = t.type_DMD
    AND (d.ETAT_DMD = 0);
    b) alors as-tu mis le lib_typ_dmd dans ta table T_CODIER?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT c.DT_DMD As Création, c.LIB_ETAT_DMD AS État, c.LIB_TYP_DMD AS Type, c.ETAT_DMD, c.CODE_ETAT_DMD, c.TYP_DMD, c.CODE_TYP_DMD
    FROM T_CODIER c, T_DEMANDE d
    WHERE 1=1
    AND  c.CODE_ETAT_DMD=d.ETAT_DMD
    AND c.CODE_TYPE_DMD = d.type_DMD
    AND (d.ETAT_DMD = 0);
    Sinon je ne comprend pas trop ton problème, un bout de ta modelisation pourrait aider.

  3. #3
    Expert éminent

    Avatar de Maxence HUBICHE
    Homme Profil pro
    Développeur SQLServer/Access
    Inscrit en
    Juin 2002
    Messages
    3 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur SQLServer/Access

    Informations forums :
    Inscription : Juin 2002
    Messages : 3 842
    Points : 9 197
    Points
    9 197
    Par défaut
    @ F.ORTIZ

    Deux questions qui m'interpellent énormément :
    1- Pourquoi mettre un
    WHERE 1=1 AND ... dans ta requête ?
    1 sera toujours égal à 1 !
    Quel est l'intérêt de dire que tu ne veux que les enregistrements pour lesquel 1=1 ????

    2- Pourquoi ne pas utiliser les INNER JOIN et favoriser, au contraire, un produit cartésien qui est plus que consommateur de ressources ?

    3- Il semble que tu aies mis 2 WHERE... ou plutôt, omis d'en retirer un lors d'un copier-coller

    @YAKICOLA
    Qu'est-ce qui t'empêche de lier Type et Etat ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT 
       DT_DMD   As Création
     , c.LIB_ETAT_DMD   AS État, 
     , c.LIB_TYP_DMD   AS Type
     , d.ETAT_DMD
     , c.CODE_ETAT_DMD
     , d.TYP_DMD
     , c.CODE_TYP_DMD
    FROM 
      T_CODIER  c
     INNER JOIN T_DEMANDE  d ON c.CODE_ETAT_DMD=d.ETAT_DMD
       AND c.CODE_TYPE_DMD = d.TYP_CMD
    WHERE (d.ETAT_DMD = 0);

  4. #4
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2013
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2013
    Messages : 34
    Points : 43
    Points
    43
    Par défaut
    @Maxence hubiche:
    Je construit toujours mes requetes avec en début un where 1=1, ca consomme un minimum de ressource (total de 1 sur le CBO d'oracle et j'ai l'habitude de travailler avec des bases oracle) et ca me permet d'avoir une structure de base pour rajouté des AND à la volée (c'est ma pratique, je ne dis pas que c'est la meilleur).
    Ensuite en ce qui concerne la syntaxe sql87 plutot que 92 c'est parce que je trouve ca plus lisible et que je pense que la lisibilité peut aider à la compréhension surtout pour les prédycats / jointure (encore une fois ce sont mes pratiques et jusqu'à présent j'ai très peu de problèmes avec) et de plus toutes les bases n'accepte pas encore la syntaxe JOIN [TABLE] ON [T1.PIVOT] = [T2.PIVOT]. De plus l'algorithme de jointure utilisé (NESTED LOOP dans le cas ou aucun index n'est établi sur une des tables de la jointure) pour une jointure SQL92 consomme plus de ressource que le produit cartesien de la Jointure SQL87.
    Après ce sont mes pratiques et je suis encore et toujours en phase d'apprentissage, surtout au niveau des bases access.

    pour ce qui est du where tu as raison, j'avais mal relu.

    Quoi qu'il en soit je m'excuse si ca a égaré quelqu'un

  5. #5
    Expert éminent

    Avatar de Maxence HUBICHE
    Homme Profil pro
    Développeur SQLServer/Access
    Inscrit en
    Juin 2002
    Messages
    3 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur SQLServer/Access

    Informations forums :
    Inscription : Juin 2002
    Messages : 3 842
    Points : 9 197
    Points
    9 197
    Par défaut
    Citation Envoyé par F.ORTIZ Voir le message
    @Maxence hubiche:
    j'ai l'habitude de travailler avec des bases oracle
    OK, je comprends mieux !

    Merci pour ces infos.

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2012
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2012
    Messages : 24
    Points : 22
    Points
    22
    Par défaut
    1- Pourquoi mettre un
    WHERE 1=1 AND ... dans ta requête ?
    J'avoue m'être posé la même question, merci pour les infos
    @YAKICOLA
    Qu'est-ce qui t'empêche de lier Type et Etat ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT 
       DT_DMD   As Création
     , c.LIB_ETAT_DMD   AS État, 
     , c.LIB_TYP_DMD   AS Type
     , d.ETAT_DMD
     , c.CODE_ETAT_DMD
     , d.TYP_DMD
     , c.CODE_TYP_DMD
    FROM 
      T_CODIER  c
     INNER JOIN T_DEMANDE  d ON c.CODE_ETAT_DMD=d.ETAT_DMD
       AND c.CODE_TYP_DMD = d.TYP_DMD
    WHERE (d.ETAT_DMD = 0);
    J'avais déjà essayé comme ça, cette requête ne fonctionne pas car (fait avec l'outil de requête d'Access) elle me donne que les lignes où ETAT_DMD = TYP_DMD.
    Avec WHERE d.ETAT_DMD = 0 je n'obtiens que les lignes avec TYP_DMD = 0, de même pour le 1.

  7. #7
    Expert éminent

    Avatar de Maxence HUBICHE
    Homme Profil pro
    Développeur SQLServer/Access
    Inscrit en
    Juin 2002
    Messages
    3 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur SQLServer/Access

    Informations forums :
    Inscription : Juin 2002
    Messages : 3 842
    Points : 9 197
    Points
    9 197
    Par défaut
    hmmm
    naaan...

    Fait avec l'outil intégré, il suffit que tu lâche un champ à lier sur la mauvaise cible, pour que le lien ne se fasse pas correctement.

    Copies/Colle ce code sql dans une fenêtre sql, dans access, et dis si c'est vraiment ce que tu obtiens !
    Je parie que non.

    Et du coup, comme ton lien n'a pas dûs faire exactement sur les bons champs (par exemple, en mettant ETAT_DMD = TYP_DMD au lieu de CODE_TYP_DMD = TYP_DMD, forcément, ta clause WHERE te donne l'impression de filtrer sur un champ, alors que tu demandais l-autre.
    Mais cela est dû à l'égalité que tu as définie dans ta clause FROM qui doit être un peu foireuse.

    Essaies pour voir

  8. #8
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2012
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2012
    Messages : 24
    Points : 22
    Points
    22
    Par défaut
    Même problème avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Liste_AlertesCtcMet.RowSource = "SELECT d.DT_DMD AS Création, c.LIB_ETAT_DMD AS État, c.LIB_TYP_DMD AS Type, d.ETAT_DMD, c.CODE_ETAT_DMD, d.TYP_DMD, c.CODE_TYP_DMD " _
    & "FROM T_CODIER AS c INNER JOIN T_DEMANDE AS d ON (c.CODE_TYP_DMD = d.TYP_DMD) AND (c.CODE_ETAT_DMD = d.ETAT_DMD) WHERE (d.ETAT_DMD = 0);"
    Je me retrouve avec seulement les lignes où l'état est égal au type.
    Avec WHERE d.ETAT_DMD = 0 j'obtiens les lignes dans lesquelles ETAT_DMD et TYP_DMD = 0
    Avec WHERE d.ETAT_DMD = 1 j'obtiens les lignes dans lesquelles ETAT_DMD et TYP_DMD = 1
    Avec WHERE d.ETAT_DMD = 2 Je n'obtiens plus rien puisque TYP_DMD n'a que 0 et 1 comme valeurs possibles.
    (ça paraît con mais je précise mes tests pour vous donner mon raisonnement)

  9. #9
    Expert éminent

    Avatar de Maxence HUBICHE
    Homme Profil pro
    Développeur SQLServer/Access
    Inscrit en
    Juin 2002
    Messages
    3 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur SQLServer/Access

    Informations forums :
    Inscription : Juin 2002
    Messages : 3 842
    Points : 9 197
    Points
    9 197
    Par défaut
    hmmm.

    bizarre autant qu'étrange, à moins que...

    Voudrais-tu bien contrôles les données présentes dans les colonnes suivantes :
    • CODE_TYP_DMD
    • TYP_DMD
    • CODE_ETAT_DMD
    • ETAT_DMD
    Je pense que c'est à ce niveau qu'il doit y avoir un souci, parce que la requête est juste.

    Fais un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT DISTINCT CODE_TYP_DMD FROM T_Codier
    un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT DISTINCT CODE_ETAT_DMD FROM T_Codier
    un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT DISTINCT TYP_DMD FROM T_DEMANDE
    et enfin, un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT DISTINCT ETAT_DMD FROM T_DEMANDE

  10. #10
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2012
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2012
    Messages : 24
    Points : 22
    Points
    22
    Par défaut
    Bonjour bonjour !

    J'ai enfin trouvé la solution à mon problème, en effet la requête était juste. C'était ma table T_CODIER qui n'était pas faite correctement (C'est la première fois que j'en faisais une )

    Afin d'éviter que la requête ne fasse des bêtises j'ai du construire ma table comme ceci :


    (J'ai rajouté le champ Statut qu'une fois l'idée fonctionnelle, je ne voulais pas compliqué le sujet plus que ça ne l'était déjà )

    Alors oui, je suis d'accord que ce n'est pas très évolutif comme ça donc je vais devoir y retoucher, mais l'idée est surtout de définir tous les cas. Et c'est la seule solution que j'ai trouvé pour tout avoir en une seule requête pour le moment !
    Merci beaucoup pour votre aide, vos pistes m'ont bien aidé à cerner le problème !

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

Discussions similaires

  1. [MySQL] pas de résultat sur requete INNER JOIN 3 tables
    Par monlou dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 31/08/2010, 09h49
  2. pb avec Group by et INNER JOIN/UPDATE TABLE
    Par Larentia dans le forum Requêtes
    Réponses: 6
    Dernier message: 19/01/2009, 20h05
  3. Réponses: 8
    Dernier message: 22/04/2008, 17h24
  4. Double INNER JOIN
    Par benjisan dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 20/06/2007, 16h47
  5. inner join pour requete update ne marche pas
    Par Garra dans le forum Requêtes
    Réponses: 4
    Dernier message: 25/01/2006, 13h14

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