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] jointure externe -> where


Sujet :

Langage SQL

  1. #1
    Rédacteur
    Avatar de MrDuChnok
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2002
    Messages
    2 112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 112
    Points : 4 240
    Points
    4 240
    Par défaut [Requete] jointure externe -> where
    Bonjour,
    j'ai construit une requete qui fonctionne bien sous SQL Server, mais une fois que je la passe sous DQL (Documentum Query Langage), là elle ne marche plus. En effet, DQL n'interprete pas les jointure externe ou interne, il ne connais que le "where"

    Mon probleme est que je n'arrive pas a "re pensé" ma requete pour qu'elle se fasse avec un where a la place des jointures externes. Est ce que vous pourriez m'aider ?

    voici ma requete initiale
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT     CLIENT.num_tel, CLIENT.nom_client, CLIENT.num_client, CDM.nom_cdm
     
    FROM      CLIENT 
     
    LEFT OUTER JOIN  CDM 
        ON CLIENT.num_cdm = CDM.num_cdm
    Dans la table CLIENT, il y a un champ 'num_cdm' qui est une clé étrangere pointant sur la table CDM. Ce champ n'est pas obligatoire.

    J'aimerai qu'il me ressorte sur une ligne, les informations num_tel, nom_cleint, num_client et nom_cdm et ceci, même si le champ num_cdm est à null (dans ce cas le nom_cdm serai mit a null aussi)

    je sais pas si j'ai été très clair

    si vous avez besoin d'information complémentaire, hesitez pas a demandé

    et merci encore a tous ceux qui se plancherons sur le probleme

  2. #2
    Membre actif
    Inscrit en
    Février 2003
    Messages
    182
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 182
    Points : 206
    Points
    206
    Par défaut
    Bonjour,

    essaies ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT     CLIENT.num_tel, CLIENT.nom_client,  
                     CLIENT.num_client, CDM.nom_cdm 
    FROM      CLIENT ,CMD
    where CLIENT.num_cdm = CDM.num_cdm
     
    OR Not exists ( Select 1 FROM  CMD
                           Where CLIENT.num_cdm = CDM.num_cdm)
    A+

  3. #3
    Rédacteur
    Avatar de MrDuChnok
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2002
    Messages
    2 112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 112
    Points : 4 240
    Points
    4 240
    Par défaut
    désolé MAMMAR mais ça marche pas ce que tu m'a dit (merci bcp qd mm ! )


    par contre moi je suis arrivé à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    SELECT CLIENT.num_tel, CLIENT.nom_client,CLIENT.num_client, CDM.nom_cdm
     
    FROM CLIENT, CDM 
     
    where CLIENT.num_cdm is not null and CLIENT.num_cdm = CDM.num_cdm 
     
    union 
     
    select CLIENT.num_tel, CLIENT.nom_client,CLIENT.num_client, NULL as nom_cdm
    FROM CLIENT
     
    where CLIENT.num_cdm is null

    ça me renvoi bien le bon résultat comme avec les jointures externes, mais bon je pense que niveau lisibilité, maintenance du code s'est pas trop ça

    surtout que cette requete est construite dynamiquement que le nom de champ et de table et de jointure change ... ^^

    donc voila, si quelqu'un a mieu...

  4. #4
    Membre averti
    Avatar de Superstivix
    Inscrit en
    Décembre 2003
    Messages
    250
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 250
    Points : 405
    Points
    405
    Par défaut
    salut
    un truc du style

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT     CLIENT.num_tel, CLIENT.nom_client, CLIENT.num_client, CDM.nom_cdm 
    FROM      CLIENT, CDM 
    WHERE CLIENT.num_cdm = CDM.num_cdm
    OR CLIENT.num_cdm is null
    devrait marcher comme tu le souhaites

    A plus
    Steve

  5. #5
    Rédacteur
    Avatar de MrDuChnok
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2002
    Messages
    2 112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 112
    Points : 4 240
    Points
    4 240
    Par défaut
    Résultat identique à la requete proposé par MAMMAR

    ça fait une apres midi que je suis dessu, je commence serieusement a me dire que DQL c'est pas très très bien... ;-)

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Points : 1 199
    Points
    1 199
    Par défaut
    bonjour,
    Je ne connais pas documentum, mais par exemple sous oracle les jointures externe sont reprsentées par des (+)
    Cela donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT     CLIENT.num_tel, CLIENT.nom_client, CLIENT.num_client, CDM.nom_cdm
    FROM      CLIENT, CDM
    WHERE CLIENT.num_cdm = CDM.num_cdm(+)
    OR CLIENT.num_cdm is null
    Il me semble que certains SGBD utilise une (*) à la place du (+), tu peux essayer.

    a+
    Soazig

  7. #7
    Rédacteur/Modérateur

    Avatar de Fabien Celaia
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2002
    Messages
    4 224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2002
    Messages : 4 224
    Points : 19 567
    Points
    19 567
    Billets dans le blog
    25
    Par défaut
    Citation Envoyé par soazig
    Il me semble que certains SGBD utilise une (*) à la place du (+), tu peux essayer.
    plus exactement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT     CLIENT.num_tel, CLIENT.nom_client, CLIENT.num_client, CDM.nom_cdm 
    FROM      CLIENT, CDM 
    WHERE CLIENT.num_cdm =* CDM.num_cdm 
    OR CLIENT.num_cdm is null
    Attention cependant au comportement non ANSI de ce type de syntaxe lorsque le filtre se porte sur la table externe de la jointure... (article à paraître prochainement sur developpez...)

  8. #8
    Rédacteur
    Avatar de MrDuChnok
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2002
    Messages
    2 112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 112
    Points : 4 240
    Points
    4 240
    Par défaut
    J'ai deja essayé aussi ce type de syntaxe, mais elle ne fonctionne pas non plus (parser error au niveau du =* ou du =+).

    J'ai regardé dans la doc de DQL et c'est précisé nulle part comment faire des jointures externes et dans la syntaxe il n'y a pas d'opérateur pour le faire ... ^^

  9. #9
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT     CLIENT.num_tel, CLIENT.nom_client,  
                     CLIENT.num_client, CDM.nom_cdm 
    FROM      CLIENT ,CMD 
    where CLIENT.num_cdm = CDM.num_cdm 
    UNION
    SELECT     CLIENT.num_tel, CLIENT.nom_client,  
                     CLIENT.num_client, NULL 
    FROM      CLIENT
    WHERE Not exists ( Select 1 FROM  CMD 
                           Where CLIENT.num_cdm = CDM.num_cdm) ;
    Vous n'étiez pas loin

  10. #10
    Rédacteur
    Avatar de MrDuChnok
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2002
    Messages
    2 112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 112
    Points : 4 240
    Points
    4 240
    Par défaut
    merci

    mais je ne vois pas la différence entre votre requete et celle que j'ai mis un peu plus haut

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
    SELECT CLIENT.num_tel, CLIENT.nom_client,CLIENT.num_client, CDM.nom_cdm 
     
    FROM CLIENT, CDM 
     
    where CLIENT.num_cdm is not null and CLIENT.num_cdm = CDM.num_cdm 
     
    union 
     
    select CLIENT.num_tel, CLIENT.nom_client,CLIENT.num_client, NULL as nom_cdm 
    FROM CLIENT 
     
    where CLIENT.num_cdm is null
    et justement le probleme avec cette requete c'est qu'elle me parai bien compliqué a construire dynamiquement (avec un nombre de table variable, nombre de champ variable, et un nombre de jointure externe non connu pfiou)

    donc c'est pourquoi je cherchai une syntaxe plus légère, mais apparement y'en a pas de plus simple

    merci

  11. #11
    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
    la requête avec CLIENT.num_cdm is null sous-entend que je connais le contexte fonctionnelle si il n'y a pas de ligne dans CMD alors num_cmd est NULL (et ça rien ne me le dis, je ne sais pas si num_cmd est NULL ou négatif ou autre )... La requête que je propose est bcp plus terre à terre : je sélectionne les lignes de CMD et CLIENT avec une jointure entre les deux et j'ajoute les lignes de client où la jointure n'existe pas avec CMD... c'est une traduction bête et méchante de la jointure externe

  12. #12
    Rédacteur
    Avatar de MrDuChnok
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2002
    Messages
    2 112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 112
    Points : 4 240
    Points
    4 240
    Par défaut
    d'accord, merci de ta reponse. Désolé de pas avoir tous compris, on va dire que c'est parce qu'on est lundi ;-)

  13. #13
    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
    pas de probléme

    Pense juste au bouton RESOLU s'il te plait

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

Discussions similaires

  1. Requete jointure externe
    Par sophie2010 dans le forum SQL
    Réponses: 7
    Dernier message: 24/01/2011, 14h59
  2. [Requête] Jointure Externe Totale
    Par alcabk dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 28/09/2006, 14h47
  3. [Access] Probléme simplification requete Jointure Externe
    Par paflolo dans le forum Langage SQL
    Réponses: 6
    Dernier message: 02/03/2006, 10h18
  4. Requete Jointure Externe...Soucis!!
    Par paflolo dans le forum Langage SQL
    Réponses: 2
    Dernier message: 01/03/2006, 11h25
  5. [requetes / Jointures externes] : expression de jointure
    Par Ptit_boeuf dans le forum Langage SQL
    Réponses: 5
    Dernier message: 28/07/2005, 16h42

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