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 :

Requete Select jointure externe.


Sujet :

Langage SQL

  1. #1
    Membre actif
    Inscrit en
    Avril 2009
    Messages
    308
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 308
    Points : 231
    Points
    231
    Par défaut Requete Select jointure externe.
    Bonjour à tous !

    J'essaye en vain de pondre une requête...et la je m'avoue vaincu.

    Alors j'ai 3 tables.

    Transaction, Articles,et Articles sérialisé.

    Ma requête doit sélectionner toutes les transactions dont le code Étiquette est égal au code_étiquette de Articles_sérialisé, OU au code_consommable de la table Article.

    Voici ce que j'ai fais et ça ne me sélectionne que les transaction concernant les articles sérialisé, pas les articles.
    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
    SELECT 
    	Transaction.IDTransaction AS IDTransaction,	
    	Transaction.Date_pret AS Date_pret,	
    	Transaction.Date_retourReel AS Date_retourReel,	
    	Transaction.Date_retour AS Date_retour,	
    	Transaction.Affaire AS Affaire,	
    	Transaction.Etat_retour AS Etat_retour,	
    	Transaction.IDEmployéRetour AS IDEmployéRetour,	
    	Type.Type AS Type,	
    	Transaction.Etat_pret AS Etat_pret,	
    	Transaction.Actu AS Actu,	
    	Transaction.Type_modif AS Type_modif,	
    	Transaction.Der_modif AS Der_modif,	
    	Transaction.Code_barre AS Code_barre,	
    	Transaction.CodeEtiquette AS Code_barreO,	
    	Employé.Nom AS Nom,	
    	Articles.Designation AS Designation
    FROM 
    	Transaction,
    	Articles,
    	Articles_serialises,
    	Type,
    	Employé
    WHERE 
    	Transaction.IDType=Type.IDType
    	AND Transaction.CodeEtiquette=Articles_serialises.CodeEtiquette 
    	OR Transaction.CodeEtiquette=Articles.CodeConsommable
    	AND Articles_serialises.CodeArticle=Articles.CodeArticle
    	AND Transaction.Code_barre = Employé.Code_barre
    	AND
    	(
    		Transaction.Code_barre = {Param1}
    		AND	Transaction.CodeEtiquette = {Param2}
    		AND	Transaction.IDType = {Param3}
    		AND	Transaction.Affaire LIKE %{Param4}%
    		AND	Transaction.Date_pret BETWEEN {Param6} AND {Param7}
    		AND	Transaction.Date_retourReel BETWEEN {Param8} AND {Param9}
    		AND	Transaction.Der_modif <= {Param10}
            )
    Vous avez rien compris ? Voici une partie de l'analyse :

    http://img268.imageshack.us/img268/1557/analyse.jpg

  2. #2
    Expert confirmé Avatar de Cybher
    Homme Profil pro
    Consultant réseaux et sécurité
    Inscrit en
    Mai 2005
    Messages
    3 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Consultant réseaux et sécurité
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Points : 4 644
    Points
    4 644
    Par défaut
    salut,

    certainement un problème de priorisation entre le AND et le OR
    Ecris aussi les jointures avec des "join", c'est plus lisible

  3. #3
    Membre éclairé Avatar de Arkhena
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 552
    Points : 769
    Points
    769
    Par défaut
    Bonjour,

    Moi je ferai un truc dans ce style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT champs
    FROM transaction INNER JOIN Articles_sérialisé ON Transaction.CodeEtiquette=Articles_serialises.CodeEtiquette
    UNION
    SELECT champs
    FROM transaction INNER JOIN Articles ON Transaction.CodeEtiquette=Articles.CodeConsommable
    Vous pouvez bien sûr de chaque côté rajouter vos autres jointures. (Essayez de les écrire suivant la norme de 1992.)

  4. #4
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    Essayez d'utiliser une VRAIE jointure externe.

    De plus, une table TRANSACTION n'est pas une bonne idée, TRANSACTION faisant partie de la grammaire SQL, vous risquez d'avoir des soucis.

    Des caracteres accentués dans le nom des tables, ou colonnes n'est pas tres conseillé non plus.

    Bon courage

  5. #5
    Membre actif
    Inscrit en
    Avril 2009
    Messages
    308
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 308
    Points : 231
    Points
    231
    Par défaut
    J'ai essayé la jointure externe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    FROM 
    Transaction,
    Articles  RIGHT OUTER JOIN Transaction ON Transaction.CodeEtiquette=Articles.CodeConsommable,
    Articles_serialises RIGHT OUTER JOIN Transaction ON Transaction.CodeEtiquette=Articles_serialises.CodeEtiquette,
    Type,
    Employé
    J'ai mes articles et mes sérialisés, mais pas la désignation des articles sérialisé qui viens de la table articles.

  6. #6
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Bonjour.
    D'après votre schéma, vous avez des relations entre :
    - Transaction et Type
    - Transcation et Articles_serialises
    A chaque fois avec une cardinalité 0,1 - 0,n donc il faut un LEFT JOIN si vous voulez toutes les transactions.

    Je suppose que la relation avec la table Employé est celle située à gauche de l'extrait de schéma. Comme elle est semble t-il de type 1,1 - 0,n, il faut un INNER JOIN.

    Il y a aussi une relation entre Articles_Serialises et Articles de type 1,1 - 0,n, ce qui veut dire qu'un article sérialisé dépend d'un article et il faut donc un INNER JOIN entre ces deux tables.

    Par contre, il n'y a pas de relation directe entre Transaction et Articles. Donc je ne vois pas l'utilité de votre question, et du OR dans votre requête, puisque normalement tous les articles sérialisés sont aussi des articles.

    Voici votre requête réécrite avec la syntaxe de jointure normalisée depuis 1992. Il serait temps de vous y mettre, ça fait quand même 17 ans ! Et c'est tellement plus lisible et facile à déboguer !
    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
    SELECT 
        tr.IDTransaction AS IDTransaction,    
        tr.Date_pret AS Date_pret,    
        tr.Date_retourReel AS Date_retourReel,    
        tr.Date_retour AS Date_retour,    
        tr.Affaire AS Affaire,    
        tr.Etat_retour AS Etat_retour,    
        tr.IDEmployéRetour AS IDEmployéRetour,    
        ty.Type AS Type,    
        tr.Etat_pret AS Etat_pret,    
        tr.Actu AS Actu,    
        tr.Type_modif AS Type_modif,    
        tr.Der_modif AS Der_modif,    
        tr.Code_barre AS Code_barre,    
        tr.CodeEtiquette AS Code_barreO,    
        e.Nom AS Nom,    
        ar.Designation AS Designation
    FROM Transaction AS tr
    INNER JOIN Employé AS e ON tr.Code_barre = e.Code_barre
    LEFT JOIN Type AS ty ON tr.IDType = ty.IDType
    LEFT JOIN Articles_serialises AS as1 ON tr.CodeEtiquette = as1.CodeEtiquette 
      INNER JOIN Articles AS ar ON as1.CodeArticle = ar.CodeArticle
    WHERE tr.Code_barre = {Param1}
      AND tr.CodeEtiquette = {Param2}
      AND tr.IDType = {Param3}
      AND tr.Affaire LIKE %{Param4}%
      AND tr.Date_pret BETWEEN {Param6} AND {Param7}
      AND tr.Date_retourReel BETWEEN {Param8} AND {Param9}
      AND tr.Der_modif <= {Param10}

  7. #7
    Membre actif
    Inscrit en
    Avril 2009
    Messages
    308
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 308
    Points : 231
    Points
    231
    Par défaut
    Je ne le redirais jamais assez, vous êtes tous tous simplement géniaux !

    MERCI POUR TOUT !

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

Discussions similaires

  1. Requete SQL jointure externe sur plusieurs tables
    Par mattmax dans le forum Développement
    Réponses: 4
    Dernier message: 28/12/2010, 10h07
  2. Requete select : jointure avec champs null
    Par Tidus159 dans le forum Langage SQL
    Réponses: 13
    Dernier message: 06/06/2008, 13h31
  3. requete selection jointure
    Par guns17 dans le forum Requêtes
    Réponses: 8
    Dernier message: 26/11/2007, 11h54
  4. [requetes / Jointures externes] : expression de jointure
    Par Ptit_boeuf dans le forum Langage SQL
    Réponses: 5
    Dernier message: 28/07/2005, 16h42
  5. [Requete] jointure externe -> where
    Par MrDuChnok dans le forum Langage SQL
    Réponses: 12
    Dernier message: 12/07/2004, 15h48

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