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

Développement SQL Server Discussion :

Construction requête : problème avec un LEFT OUTER JOIN


Sujet :

Développement SQL Server

  1. #1
    Nouveau membre du Club
    Inscrit en
    Octobre 2004
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 71
    Points : 38
    Points
    38
    Par défaut Construction requête : problème avec un LEFT OUTER JOIN
    Bonjour à tous,

    Je galère à construire une requête qui implique un OUTER JOIN.
    J'espère que vous pourrez m'aider avec les indications suivantes :

    Dans mon modèle (voir ce screenshot : Nom : modèle.png
Affichages : 260
Taille : 58,9 Ko), je parle de sachets (de graines). A ces sachets sont rattachées des caractéristiques. Il y en a pas mal, et les utilisateurs ne veulent pas tous les afficher à l'écran, donc ils ont des profils d'affichage dans lesquels ils choisissent les caractéristiques qu'ils veulent voir.
    Les sachets sont ajoutés à des listes de semis.
    Ce qui m'intéresse, c'est, pour une liste de semis donnée, d'aller chercher le parent de chaque sachet et d'afficher, selon le profil donné en paramètre, ses caractéristiques.
    Une caractéristique peut prendre une valeur_id (ex : 1, 2, 3...) qui correspond à une signification (ex : bien, bof, pas bien...) . C'est valeur_id qui est stocké au niveau de la table "carac_sachet", mais l'utilisateur veut voir la signification de cette valeur, stockée dans "carac_valeurs".

    Problème que je rencontre : seules les caractéristiques renseignées (celles pour lesquelles le sachet parent a une valeur) ressortent dans la requête. Je voudrais aussi voir les caractéristiques pour lesquelles il n'y a pas d'enregistrement pour le sachet. Il me semblait avoir fait ce qui fallait en insérant un left outer join, mais il doit visiblement manquer qqchose. Pourriez-vous me dire quoi ?

    J'espère que tout ceci est compréhensible... Merci d'avance !

    Voici la requête que j'ai tentée :
    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
     
    SELECT sachet.kav_id AS lot, semis_contenu.mispar_mashtela AS sowing_no,
      sachet.hore_nekeva AS parent_lot, sachet_parent.kitzur_shoshelet AS
      parent_gen, carac_sachet.tchuna_value AS trait_value,
      carac.short_name AS trait_short_name, carac_valeurs.tchuna_translation AS
      trait_translation, profil.profile_name AS profile_name,
      semis.name AS sowing_name, sachet_parent.kav_halofi AS parent_name,
      profil_carac.tchuna_order AS trait_order
    FROM kav sachet 
    INNER JOIN reshimat_mashtela_kav semis_contenu ON sachet.kav_id = semis_contenu.kav_id
        AND sachet.maslul_id = semis_contenu.maslul_id 
    INNER JOIN reshimat_mashtela semis ON semis.reshimat_mashtela_id = semis_contenu.reshimat_mashtela_id 
    INNER JOIN kav sachet_parent ON sachet.hore_nekeva = sachet_parent.kav_id 
    LEFT OUTER JOIN kav_tchuna carac_sachet ON sachet_parent.kav_id = carac_sachet.kav_id 
    	AND sachet_parent.maslul_id = carac_sachet.maslul_id 
    INNER JOIN tchuna carac ON carac.tchuna_type = carac_sachet.tchuna_type 
    INNER JOIN tchuna_value carac_valeurs ON carac.tchuna_type = carac_valeurs.tchuna_type
        AND carac_sachet.tchuna_value = carac_valeurs.tchuna_value 
    INNER JOIN profile_tchuna profil_carac ON profil_carac.tchuna_type = carac.tchuna_type
    INNER JOIN tch_profile profil ON profil.profile_id = profil_carac.profile_id
    WHERE profil.profile_name = @nom_profil
    AND semis.name = @nom_semis

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour

    J'ai du mal à comprendre votre modèle, mais si j'ai bien compris votre problème, il faudrait un produit cartésien entre les sachets et les caractéristiques avant de faire votre jointure externe sur la table associative.

    au passage : qu'est-ce que maslul_id ?

    Enfin, attention a vos jointures interne suivantes qui annulent l'effet de la jointure externe : il fut également les passer en jointure externes.

    N'ayant pas tout compris, voici une correction de principe, qu'il faudra certainement également modifier
    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
     
    SELECT sachet.kav_id AS lot, semis_contenu.mispar_mashtela AS sowing_no,
      sachet.hore_nekeva AS parent_lot, sachet_parent.kitzur_shoshelet AS
      parent_gen, carac_sachet.tchuna_value AS trait_value,
      carac.short_name AS trait_short_name, carac_valeurs.tchuna_translation AS
      trait_translation, profil.profile_name AS profile_name,
      semis.name AS sowing_name, sachet_parent.kav_halofi AS parent_name,
      profil_carac.tchuna_order AS trait_order
    FROM kav sachet 
    INNER JOIN reshimat_mashtela_kav semis_contenu ON sachet.kav_id = semis_contenu.kav_id
        AND sachet.maslul_id = semis_contenu.maslul_id 
    INNER JOIN reshimat_mashtela semis ON semis.reshimat_mashtela_id = semis_contenu.reshimat_mashtela_id 
    INNER JOIN kav sachet_parent ON sachet.hore_nekeva = sachet_parent.kav_id 
    CROSS JOIN tchuna carac 
     
    LEFT OUTER JOIN kav_tchuna carac_sachet ON sachet_parent.kav_id = carac_sachet.kav_id 
    	AND sachet_parent.maslul_id = carac_sachet.maslul_id 
    AND carac.tchuna_type = carac_sachet.tchuna_type 
     
    LEFT JOIN tchuna_value carac_valeurs ON carac.tchuna_type = carac_valeurs.tchuna_type
        AND carac_sachet.tchuna_value = carac_valeurs.tchuna_value 
    INNER JOIN profile_tchuna profil_carac ON profil_carac.tchuna_type = carac.tchuna_type
    INNER JOIN tch_profile profil ON profil.profile_id = profil_carac.profile_id
    WHERE profil.profile_name = @nom_profil
    AND semis.name = @nom_semis

  3. #3
    Membre régulier
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2007
    Messages : 89
    Points : 117
    Points
    117
    Par défaut
    Bonjour,

    Apparemment le LEFT OUTER JOIN porte sur kav_tchuna (carac_sachet), et non sur kav (sachet_parent).

    Si cependant cela ne résoud pas le problème, sans jeu de données en exemple et DDL ça va être un peu compliqué...
    D'autre part, les INNER JOIN peuvent contrecarrer un OUTER JOIN.
    N'est-il pas possible de se limiter dans un premier temps aux deux tables concernées par la problématique ?

    Quoi qu'il en soit, si vous devez reposter, prévoyez un jeu de données pour obtenir des réponses rapides

    HTH,

  4. #4
    Nouveau membre du Club
    Inscrit en
    Octobre 2004
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 71
    Points : 38
    Points
    38
    Par défaut
    Merci à tous les 2 pour vos réponses.
    @aieeeuuuuu : la solution proposée marche parfaitement, super ! Pour info, maslul_id est l'espèce rattachée au sachet. Chaque code sachet est unique au sein d'une espèce, d'où la nécessiter d'inclure cette dernière dans les requêtes.

    En tout cas merci beaucoup, je vais du coup regarder plus en détail pour comprendre comment ça marche.

    @OokieDookie91 : compris, la prochaine fois je mets un petit jeu de données (quel format ?) pour rendre les choses plus facile.


  5. #5
    Membre régulier
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2007
    Messages : 89
    Points : 117
    Points
    117
    Par défaut
    Pas de souci, aieeeuuuuu passait par là

    Pour le jeu de test, petit bout de code encadré avec la balise qui va bien :

    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
    -- Déclaration de ma / mes tables
    -- A répéter si nécessaire autant de fois qu'il y a de tables
    DECLARE @ARTICLES TABLE(IdArt INT IDENTITY(1,1), CodeArt VARCHAR(15) NOT NULL, LibArt VARCHAR(50) NULL)
     
    -- Quelques valeurs pour chaque table
    INSERT INTO @ARTICLES(CodeArt, LibArt) VALUES ('ART1', 'Article 1')
    INSERT INTO @ARTICLES(CodeArt, LibArt) VALUES ('ART2', 'Article 2')
    INSERT INTO @ARTICLES(CodeArt, LibArt) VALUES ('ATR3', 'Article 3')
     
    -- Et ma requête
    SELECT
    	IdArt,
    	CodeArt,
    	LibArt
    FROM
    	@ARTICLES
    WHERE
    	CodeArt NOT LIKE 'ART%'
    Bonne journée.

  6. #6
    Nouveau membre du Club
    Inscrit en
    Octobre 2004
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 71
    Points : 38
    Points
    38
    Par défaut
    Bonjour à tous,

    Il y a quelques mois, j'avais demandé de l'aide en ouvrant ce topic.
    La réponse de aieeeuuuuu convenait à priori parfaitement, mais je m'aperçois aujourd'hui qu'il manquait un petit qqchose dans la requête.
    En effet, c'est comme si la requête ramenait TOUTES les caractéristiques, peu importe si elles sont dans le profil sélectionné (@nom_profil) ou pas.

    Je sais qu'idéalement un jeu de données vous aiderait beaucoup, mais comme ça me demanderait pas mal de boulot (ce n'est pas moi qui ai créé la base, j'ai des connaissances limitées), je me dis que peut-être mes indications vous suffiront.

    Je suppose que le problème se situe dans la dernière partie de la requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    LEFT JOIN tchuna_value carac_valeurs ON carac.tchuna_type = carac_valeurs.tchuna_type
        AND carac_sachet.tchuna_value = carac_valeurs.tchuna_value 
    INNER JOIN profile_tchuna profil_carac ON profil_carac.tchuna_type = carac.tchuna_type
    INNER JOIN tch_profile profil ON profil.profile_id = profil_carac.profile_id
    WHERE profil.profile_name = @nom_profil
    AND semis.name = @nom_semis
    car c'est là que se fait le lien entre les caractéristiques à afficher, et le contenu du profil. Mais je ne trouve pas ce qui cloche...

    Qu'en pensez-vous ?

    Merci pour votre aide.

  7. #7
    Nouveau membre du Club
    Inscrit en
    Octobre 2004
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 71
    Points : 38
    Points
    38
    Par défaut
    Résolu, il manquait un lien entre le profil et le numéro de l'équipe (maslul_id).

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

Discussions similaires

  1. Requête complexe avec des LEFT OUTER JOIN
    Par bella125 dans le forum Requêtes
    Réponses: 4
    Dernier message: 10/04/2014, 11h51
  2. Problème avec un FULL OUTER JOIN
    Par sky_perrinos dans le forum Requêtes
    Réponses: 3
    Dernier message: 07/04/2014, 15h34
  3. Sélection d'un MIN(field) avec un LEFT OUTER JOIN
    Par bilbonec dans le forum Requêtes
    Réponses: 4
    Dernier message: 10/09/2012, 11h52
  4. Problème sum et left outer join from multi table
    Par nabilfaouzi dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 31/01/2012, 13h06
  5. [MySQL] doublons avec du left outer join
    Par bigs3232 dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 04/10/2010, 21h41

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