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 :

left outer join marche pas


Sujet :

Langage SQL

  1. #1
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut left outer join marche pas
    Bonjour

    J'ai deux table
    La premiere contient une liste complete d'adresse
    La deuxieme contient un sous ensemble de cette liste

    Je voudrais combiner les info de la premiere avec la deuxieme mais dans tous les cas afficher les infos de la première table meme si l'adresse n'est pas dans la deuxieme

    J'ai essayé le right et left outer join mais tous les deux me donnent le meme resultat qu'un inner join

    Ou est l'erreur ???


    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
    SELECT
    `tours`.`order1`,
    `tours`.`addrID`,
    `tours`.`chauffeurID`,
    `tours`.`dag`,
    `main`.`Post`,
    `main`.`Plaats`,
    `main`.`Straat`,
    `main`.`Omschrijving`
    FROM
    `tours`
    Right Outer Join `main` ON `tours`.`addrID` = `main`.`Addrid`
    WHERE
    `main`.`TP` =  'nul'
    order by chauffeurid,dag,order1

  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
    bonsoir,

    le right join devrait fonctionner

    Peux tu donner un petit jeu d'essai?

    es tu sur d'avoir dans ta table main un enregistrement dont le tp vaut 'nul' et qui n'a pas de correspodance dans l'autre table?

  3. #3
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Salut
    Merci pour ta réponse

    J'ai essayé right outer et left outer
    Pas de resultat correspondant a la realité

    Mais j'ai trouvé que c'est la clause where qui tue

    Dans main j'ai +/- 2000 records
    Dans tout j'en ai +/- 5200

    Si j'enleve le where j'obtiens les +/ 5200 de tours qui sont ma reference
    Si je mets le where, je tombe a 900 records OR le nombre total de records ne devrait pas bouger simplement le contenu, c'est pour ca que je fais un left outer ?

    En tout cas je l'ai fait maintenant en programmation les résultats farfelus de SQL m'énervaient trop !

  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
    Bonjour,

    Je vais etre moins categorique que Cybher. En effet syntaxiquement, votre requete avec jointure explicite est correcte. Cependant votre clause where va exclure de l'ensemble de votre jointure les tuples dont main.TP n'est pas 'nul' .
    Deplacez votre clause WHERE dans votre condition de jointure explicite :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ON tour.addrID = main.Addrid and main.TP ='nul'

  5. #5
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut


    Bravo chef !
    C'était bien ca le problème

    Voila une chose que je viens d'apprendre et que je n'oublierai plus !
    Merci beaucoup

  6. #6
    Nouveau Candidat au Club
    Inscrit en
    Septembre 2008
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Desole d'uper ce message mais je tenais a souligner l'efficacite de l'addition de la clause de filtrage a la jointure.

    Cette methode est terriblement efficace et je ne savais pas que cela etait possible!

    Merci beaucoup pour cette solution

  7. #7
    Candidat au Club
    Inscrit en
    Novembre 2008
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Bonjour,

    J'ai un pb sur le même type de requête. J'essaie de récupérer les donnée de la table TABLE1 et ses données complémentaires de la table TABLE1_COMP si elles existent.
    Sur ce résultat je souhaite filtrer toutes les lignes possédant des données de TABLE1_COMP dont TABLE1_COMP.num>100.


    En mettant cette dernière clause dans la jointure externe, les champs de TABLE1_COMP des lignes dont TABLE1_COMP.num>100 sont retournés à NULL mais les lignes ne sont pas filtrées:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT * 
    FROM TABLE1 t1 
    LEFT OUTER JOIN TABLE1_COMP tc ON t1.id=tc.id AND tc.num>100

    En mettant la clause dans le where, toutes les lignes où la jointure ne se fait pas sont filtrées:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT * 
    FROM TABLE1 t1 
    LEFT OUTER JOIN TABLE1_COMP tc ON t1.id=tc.id 
    WHERE tc.num>100
    Quelqu'un peut-il m'aider?

    Merci

  8. #8
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 950
    Points : 5 849
    Points
    5 849
    Par défaut
    Salut,
    Essaie peut être comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT *
    FROM TABLE1 t1
    LEFT OUTER JOIN TABLE1_COMP tc ON t1.id=tc.id
    WHERE tc.num>100
    or tc.num is null

  9. #9
    Candidat au Club
    Inscrit en
    Novembre 2008
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Merci pour la réponse!
    Cette méthode semble convenir pour des tables petites mais elle s'avère très coûteuse en temps d'exécution (ici 40 sec) pour des tables de plus grandes taille puisque la plupart des lignes sont retournées par la clause tc.num IS NULL...

    Du coup pour ces tables, je ne vois pas d'autres solutions que de faire la jointure externe en sql et le filtre en java...

    Quelqu'un a-t-il une autre solution?

  10. #10
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Dans des cas comme ca, je passe souvent par une table temporaire !

  11. #11
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 950
    Points : 5 849
    Points
    5 849
    Par défaut
    Autre possibilité, mais pas sûr que ce soit mieux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT t1.*
    FROM TABLE1 t1
    JOIN TABLE1_COMP tc ON t1.id=tc.id
    WHERE tc.num>100
    UNION ALL
    SELECT t1.*
    FROM TABLE1 t1
    where not exists (select 1 from TABLE1_COMP tc where t1.id=tc.id)

  12. #12
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Franchement, la mecanique de la table temporaire quand on y a gouté c'est tres efficace et généralement beaucoup plus facile a lire sans surprises !

    Mais je ne suis pas du tout expert en SQL !

  13. #13
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 394
    Points
    18 394
    Par défaut
    Sambah, avez-vous besoin des informations de TABLE1_COMP ou bien est-ce que le champ "num" n'est utilisé que pour le filtrage ?

  14. #14
    Candidat au Club
    Inscrit en
    Novembre 2008
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Alors j'avais aussi essayé la solution contenant la clause suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE NOT EXISTS (SELECT 1 FROM TABLE1_COMP tc WHERE t1.id=tc.id)
    Malheureusement la taille des 2 tables rend la requête très lente.

    Je vais essayer de passer par une table temporaire pour rendre le traitement plus rapide.

    Sinon pour la question précédente j'ai beson d'un champ de la table TABLE1_COMP (pas tc.id)

    Merci pour vos réponses

  15. #15
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 394
    Points
    18 394
    Par défaut
    On peut peut-être faire autrement avec un index de fonction.
    Utilisez la requête suivante (la première de skuatamad avec le null géré) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT *
    FROM TABLE1 t1
    LEFT OUTER JOIN TABLE1_COMP tc ON t1.id=tc.id
    WHERE COALESCE(tc.num, 9999999999) >100
    Créez un index sur "COALESCE(tc.num, 9999999999)".
    Celà devrait fonctionner, à vous d'essayer et de nous dire.

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

Discussions similaires

  1. Left outer join, ne marche pas
    Par lido dans le forum Forms
    Réponses: 5
    Dernier message: 04/06/2008, 13h05
  2. [MySQL] left outer join et concaténation dans un tableau passe par if mais pas par else ?
    Par SpaceFrog dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 08/04/2008, 16h09
  3. Problème avec left outer join
    Par jgfa9 dans le forum Requêtes
    Réponses: 1
    Dernier message: 22/08/2005, 22h07
  4. Problème de performance avec LEFT OUTER JOIN
    Par jgfa9 dans le forum Requêtes
    Réponses: 6
    Dernier message: 17/07/2005, 14h17
  5. concatenation de chaine dans un left outer join
    Par the_edge dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 11/11/2004, 17h08

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