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 :

[SQL Server] 2 tables jointes: extraire 2 libellés dont les codes sont dans 1 table


Sujet :

Langage SQL

  1. #1
    Membre habitué
    Inscrit en
    Mai 2003
    Messages
    361
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 361
    Points : 146
    Points
    146
    Par défaut [SQL Server] 2 tables jointes: extraire 2 libellés dont les codes sont dans 1 table
    Bonsoir,
    J’ai deux tables :
    Reclamation avec les champs : NRecl, Nexp, NDes
    Entite avec les champs : NEntite, Libelle

    NExp et NDes sont des entités, j’aimerai que leurs libellés apparaissent à partir d’une requete.

    Début requete :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT     R.NExpediteur, E.NEntite, E.Nom as Expediteur,R.NDestinateur
    FROM         dbo.TReclamations R, TEntites E
    WHERE          R.NDestinateur = E.NEntite
    Comment faire pour afficher ces libellés ?
    Merci

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    100
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Décembre 2006
    Messages : 100
    Points : 116
    Points
    116
    Par défaut
    Bonjour,

    Essaie de double l'utilisation de la table TEntites.

    Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT e1.nom AS Destinataire, e2.nom AS Expediteur
    FROM TReclamations r, TEntites e1, TEntites e2
    WHERE r.ndest = e1.nentite
    AND r.nexp = e2.nentite
    PS:J'ai pas essayé

  3. #3
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Points : 1 775
    Points
    1 775
    Par défaut
    Essayez :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT R.NExpediteur, E1.NEntite, E1.Libelle AS Expediteur, E2.NEntite, E2.Libelle AS Destinataire
    FROM         dbo.TReclamations R, TEntites E1, TEntites E2
    WHERE        R.NDestinateur = E1.NEntite
    AND          R.NExpediteur = E2.NEntite
    Cependant, quelques remarques :
    - votre syntaxe est complètement obsolète
    - si TReclamations.NDestinateur ou TReclamations.NExpediteur est NULL alors la ligne complète ne sera pas retournée ; il faudrait remplacer les 2 jointures ci-dessus par 2 jointures externes
    Modérateur des forums Oracle et Langage SQL
    Forum SQL : je n'interviens PAS plus de 4 fois dans une discussion car si c'est nécessaire cela prouve généralement que vous n'avez pas respecté : les règles du forum

  4. #4
    Membre habitué
    Inscrit en
    Mai 2003
    Messages
    361
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 361
    Points : 146
    Points
    146
    Par défaut
    c'est vrai que le résulta est exact.

    Comment faire pour 2 jointures externes?
    si TReclamations.NDestinateur ou TReclamations.NExpediteur est NULL alors la ligne complète ne sera pas retournée ; il faudrait remplacer les 2 jointures ci-dessus par 2 jointures externes

  5. #5
    Membre habitué
    Inscrit en
    Mai 2003
    Messages
    361
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 361
    Points : 146
    Points
    146
    Par défaut
    pour faire la jointure externe j'ai mis le (+)
    mais il ya une erreur. j'utilise ms sql

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT R.NExpediteur, E1.NEntite, E1.Nom AS Expediteur, E2.NEntite, E2.Nom AS Destinataire
    FROM         dbo.TReclamations R, TEntites E1, TEntites E2
    WHERE        R.NDestinateur(+) = E1.NEntite
    AND          R.NExpediteur = E2.NEntite

  6. #6
    Membre habitué
    Inscrit en
    Mai 2003
    Messages
    361
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 361
    Points : 146
    Points
    146
    Par défaut
    j'ai essayé de faire la jointure externe, mais c'est Sans succès!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT TReclamations.NExpediteur, E1.NEntite, E1.Nom AS Expediteur, TReclamations.NDestinateur,E2.NEntite, E2.Nom AS Destinataire
    FROM   TReclamations  LEFT OUTER JOIN TEntites E2
    ON       TReclamations.NDestinateur = E2.NEntite
          LEFT  OUTER JOIN TReclamations.NExpediteur
                ON TReclamations.NExpediteur = E1.NEntite

  7. #7
    Membre habitué
    Inscrit en
    Mai 2003
    Messages
    361
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 361
    Points : 146
    Points
    146
    Par défaut
    C'eest résolu!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT TReclamations.NExpediteur, E1.NEntite, E1.Nom AS Expediteur,TReclamations.NDestinateur,E2.NEntite, E2.Nom AS Destinataire
    FROM   TReclamations
           LEFT  OUTER JOIN TEntites E1
                ON TReclamations.NExpediteur = E1.NEntite
           LEFT  OUTER JOIN TEntites E2
                ON TReclamations.NDestinateur = E2.NEntite
    Merci encore!

  8. #8
    Membre expérimenté

    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 298
    Points : 1 578
    Points
    1 578
    Par défaut Ce que j'essaierais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT     R.NExpediteur, 
     
    ( Select Nom from TEntites where NEntite = R.NExpediteur )  AS Expediteur,
     
    R.NDestinateur, 
     
    ( Select Nom from TEntites where NEntite = R.NDestinateur )  AS Destinataire
     
    FROM         TReclamations R

  9. #9
    Membre habitué
    Inscrit en
    Mai 2003
    Messages
    361
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 361
    Points : 146
    Points
    146
    Par défaut
    c'est vrai que le code de Mercure tourne bien.
    Mais:
    si TReclamations.NDestinateur ou TReclamations.NExpediteur est NULL alors la ligne complète ne sera pas retournée ; il faudrait remplacer les 2 jointures ci-dessus par 2 jointures externes

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    100
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Décembre 2006
    Messages : 100
    Points : 116
    Points
    116
    Par défaut
    Magnus :
    - ok pour les jointures externes
    - En quoi la syntaxe est obsolète ? (affin d'améliorer mes futurs requêtes)

  11. #11
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Points : 1 775
    Points
    1 775
    Par défaut
    Citation Envoyé par Sifo-Dyas
    - En quoi la syntaxe est obsolète ? (affin d'améliorer mes futurs requêtes)
    De faire les jointures dans la clause WHERE alors que l'on peut utiliser les mots clés INNER JOIN, OUTER JOIN, etc.
    Cf. cet article : http://sql.developpez.com/sqlaz/jointures/#L1.2
    Modérateur des forums Oracle et Langage SQL
    Forum SQL : je n'interviens PAS plus de 4 fois dans une discussion car si c'est nécessaire cela prouve généralement que vous n'avez pas respecté : les règles du forum

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    100
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Décembre 2006
    Messages : 100
    Points : 116
    Points
    116
    Par défaut
    Merci pour l'info.
    J'essayerais d'en tenir compte à l'avenir (les habitudes sont coriaces).

  13. #13
    Membre expérimenté

    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 298
    Points : 1 578
    Points
    1 578
    Par défaut Fonctions SQL IFNULL() ou COALESCE()
    Cari dit :
    si TReclamations.NDestinateur ou TReclamations.NExpediteur est NULL alors la ligne complète ne sera pas retournée ; il faudrait remplacer les 2 jointures ci-dessus par 2 jointures externes
    Je ne suis pas d'accord. SQL retournerait dans ce cas "-" (tiret ou équivalent, selon le SGBD) dans la colonne concernée.

    Maintenant, dans la mesure où la fonction IFNULL() ou COALESCE() est supportée par ton SGBD, on pourrait écrire la requête de façon à traiter les lignes où TReclamations.NDestinateur ou TReclamations.NExpediteur est NULL.
    Dans ce cas, on renverrait par exemple un 0 au lieu de "null", comme l'illustre le Select ci-dessous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT     R.NExpediteur, 
     
    COALESCE(( SELECT Nom FROM TEntites WHERE NEntite = R.NExpediteur ) , 0) 
    AS Expediteur,
     
    R.NDestinateur, 
     
    IFNULL(( SELECT Nom FROM TEntites WHERE NEntite = R.NDestinateur ) , 0)  
    AS Destinataire
     
    FROM         TReclamations R
    Mais je pense qu'un LEFT OUTER JOIN avec la table TEntites doit créer moins d'overhead réducteur de performances et j'opterais en final pour ce type de jointure.

  14. #14
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Points : 1 775
    Points
    1 775
    Par défaut
    Citation Envoyé par Mercure
    Je ne suis pas d'accord. SQL retournerait dans ce cas "-" (tiret ou équivalent, selon le SGBD) dans la colonne concernée.
    Testé sous Oracle 10g :
    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
    10g CYRIL> select *
      2  from treclamations;
     
    NRECL      NDESTINATE NEXPEDITEU
    ---------- ---------- ----------
    01                    XX
     
    1 ligne sélectionnée.
     
    10g CYRIL> select *
      2  from tentites;
     
    NENTITE    LIBELLE
    ---------- --------------------------------------------------
    XX         LIBELLÉ X
    YY         LIBELLÉ Y
     
    2 ligne(s) sélectionnée(s).
     
    10g CYRIL> SELECT R.NEXPEDITEUR, E1.NENTITE, E1.LIBELLE AS EXPEDITEUR, E2.NENTITE, E2.LIBELLE AS DESTINATAIRE
      2  FROM         TRECLAMATIONS R, TENTITES E1, TENTITES E2
      3  WHERE        R.NDESTINATEUR = E1.NENTITE
      4  AND          R.NEXPEDITEUR = E2.NENTITE;
     
    aucune ligne sélectionnée
     
    10g CYRIL> SELECT R.NEXPEDITEUR, E1.NENTITE, E1.LIBELLE AS EXPEDITEUR, E2.NENTITE, E2.LIBELLE AS DESTINATAIRE
      2  FROM         TRECLAMATIONS R, TENTITES E1, TENTITES E2
      3  WHERE        R.NDESTINATEUR = E1.NENTITE(+)
      4  AND          R.NEXPEDITEUR = E2.NENTITE(+);
     
    NEXPEDITEU NENTITE    EXPEDITEUR                                         NENTITE    DESTINATAIRE
    ---------- ---------- -------------------------------------------------- ---------- --------------------------------------------------
    XX                                                                       XX         LIBELLÉ X
     
    1 ligne sélectionnée.
    Modérateur des forums Oracle et Langage SQL
    Forum SQL : je n'interviens PAS plus de 4 fois dans une discussion car si c'est nécessaire cela prouve généralement que vous n'avez pas respecté : les règles du forum

  15. #15
    Membre expérimenté

    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 298
    Points : 1 578
    Points
    1 578
    Par défaut
    Je ne comprends pas cette réponse qui a priori me concerne.

  16. #16
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Points : 1 775
    Points
    1 775
    Par défaut
    En d'autres termes, pour une quelconque ligne de TReclamations, si NDestinateur ou NExpediteur n'est pas renseigné (donc à NULL) alors si l'on ne fait pas de jointure externe, cette ligne ne figurera pas en sortie.
    Modérateur des forums Oracle et Langage SQL
    Forum SQL : je n'interviens PAS plus de 4 fois dans une discussion car si c'est nécessaire cela prouve généralement que vous n'avez pas respecté : les règles du forum

  17. #17
    Membre expérimenté

    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 298
    Points : 1 578
    Points
    1 578
    Par défaut
    Ce n'est pas le cas avec la requête que j'ai proposé à Cari.

    Posté hier à 18:31
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT     R.NExpediteur, 
     
    ( SELECT Nom FROM TEntites WHERE NEntite = R.NExpediteur )  AS Expediteur,
     
    R.NDestinateur, 
     
    ( SELECT Nom FROM TEntites WHERE NEntite = R.NDestinateur )  AS Destinataire
     
    FROM         TReclamations R

  18. #18
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Points : 1 775
    Points
    1 775
    Par défaut
    Citation Envoyé par Mercure
    Ce n'est pas le cas avec la requête que j'ai proposé à Cari.
    Effectivement si tu parles de ta requête et non de la mienne, je suis d'accord mais tu conviendras du fait que la syntaxe est plutôt complexe et difficile à maintenir comparée à une simple requête avec jointure externe.
    Bref, on s'est compris.
    Modérateur des forums Oracle et Langage SQL
    Forum SQL : je n'interviens PAS plus de 4 fois dans une discussion car si c'est nécessaire cela prouve généralement que vous n'avez pas respecté : les règles du forum

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

Discussions similaires

  1. [PowerShell] Enregistrer les programmes installés dans une table sql server
    Par Seriale dans le forum Scripts/Batch
    Réponses: 0
    Dernier message: 10/02/2014, 13h23
  2. modifier des tables dont les noms sont dans une autre
    Par lapin_did dans le forum Requêtes
    Réponses: 1
    Dernier message: 06/09/2010, 09h45
  3. Réponses: 7
    Dernier message: 05/09/2008, 11h07
  4. Réponses: 11
    Dernier message: 18/10/2007, 12h49
  5. Réponses: 10
    Dernier message: 16/09/2006, 11h41

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