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 :

Problème sur un jointure externe


Sujet :

Développement SQL Server

  1. #1
    Membre du Club
    Inscrit en
    Juin 2008
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 70
    Points : 59
    Points
    59
    Par défaut Problème sur un jointure externe
    Bonjour,

    j'essaye tant bien que mal de réaliser une jointure externe mais hélas, le résultat n'est pas concluant ...

    J'ai une table Aptitude:

    code | nom
    1 | Courage
    2 | Combativité
    3 | Force

    et une table posseder:

    codePersonne | codeAptitude | note
    1 | 1 | 18
    1 | 2 | 13

    J'aimerais que dans ma requête soit afficher le résultat suivant:
    nom(aptitude) | note
    Courage | 18
    Combativité | 13
    Force | NULL

    Or ma requête suivante ne marche puisqu'elle n'affiche pas la dernière ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select a.nom,p.note
    from posseder p right outer join aptitude a on p.codeAptitude=a.code
    where p.codePersonne=1
    Voilà je ne vois pas trop où est mon erreur, merci d'avance.

  2. #2
    Membre confirmé Avatar de agemis31
    Profil pro
    DBA
    Inscrit en
    Octobre 2007
    Messages
    399
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : DBA

    Informations forums :
    Inscription : Octobre 2007
    Messages : 399
    Points : 478
    Points
    478
    Par défaut Plus d'infos
    Bonjour,

    Que voulez vous afficher dans la troisième ligne ?

    La colonne codeJoueur, c'est la colonne codePersonne de la table posseder ?


    Si vous voulez afficher toutes les aptitudes d'une personne, même celles
    qu'elle ne possède pas, en y mettant une note arbitraire (ici 0).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT aptitude.nom, ISNULL(posseder.note,0)
    FROM aptitude 
    LEFT JOIN  posseder ON aptitude.code = posseder.codeaptitude
    WHERE codeJoueur IS NULL OR codeJoueur = 1

    Pour les jointures, allez voir ici



    @+

  3. #3
    Membre du Club
    Inscrit en
    Juin 2008
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 70
    Points : 59
    Points
    59
    Par défaut
    J'ai édité mon premier message, en effet codePersonne était la même chose que codeJoueur mais je l'ai remis bien maintenant.

    En ce qui concerne ce que je veux afficher, c'est exactement ce que tu dis, je veux avoir toutes les aptitudes même celle que la personne de code 1 n'a pas dans la table posseder et mettre une note de 0 par exemple ou un "NULL" en tant que note.

    J'ai essayé la requête que tu m'as dit et elle n'affiche pas les caractéritiques que la personne n'a pas, juste les caras qu'elle a.

  4. #4
    Membre confirmé Avatar de agemis31
    Profil pro
    DBA
    Inscrit en
    Octobre 2007
    Messages
    399
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : DBA

    Informations forums :
    Inscription : Octobre 2007
    Messages : 399
    Points : 478
    Points
    478
    Par défaut Ah bon ...
    Bonsoir

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    declare @aptitude table (code int, nom varchar(50))
    insert into @aptitude select 1 ,'Courage'
    insert into @aptitude select 2, 'Combativité'
    insert into @aptitude select 3 ,'Force'
     
    declare @posseder table (codePersonne int, codeAptitude int, note int)
    insert into @posseder select 1,1, 18
    insert into @posseder select 1,2, 13
     
    SELECT nom, note
    FROM @aptitude 
    LEFT JOIN  @posseder ON code = codeaptitude
    WHERE codePersonne IS NULL OR codePersonne = 1
    Ca ne renvoie pas ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    nom                                                note
    -------------------------------------------------- -----------
    Courage                                            18
    Combativité                                        13
    Force                                              NULL

  5. #5
    Membre du Club
    Inscrit en
    Juin 2008
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 70
    Points : 59
    Points
    59
    Par défaut
    J'ai essayé ton exemple en créant un base de données ainsi que le tables et il marche en effet (tu n'es pas fou :p)

    Mais avec mon cas ça ne marche toujours pas, cela vient peut être d'autre chose alors, les clés étrangères, les not null je ne sais pas trop.
    Je vais donc copier ici la création des tables (concernées) ainsi que le jeu d'essai.
    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
     
    CREATE TABLE JOUEUR (
    code int not null,
    nom char(50) not null,
    prenom char(50) not null,
    /* patatipatata */
    CONSTRAINT pk_joueur PRIMARY KEY (code))
     
    CREATE TABLE APTITUDE (
    code int not null,
    nom char(30) not null,
    typeA tinyint not null,
    CONSTRAINT pk_aptitude PRIMARY KEY (code))
     
    CREATE TABLE POSSEDER (
    codeJoueur int not null,
    codeAptitude int not null,
    note int not null,
    CONSTRAINT pk_posseder PRIMARY KEY (codeJoueur,codeAptitude),
    CONSTRAINT fk_posseder_joueur FOREIGN KEY (codeJoueur) REFERENCES JOUEUR (code),
    CONSTRAINT fk_posseder_aptitude FOREIGN KEY (codeAptitude) REFERENCES APTITUDE (code))
     
    INSERT INTO JOUEUR VALUES (1,'Ardeois','Romuald')
    INSERT INTO JOUEUR VALUES (2,'Mélaise','Pierre')
     
    INSERT INTO APTITUDE VALUES (1,'Passe',1)
    INSERT INTO APTITUDE VALUES (2,'Tir',1)
    INSERT INTO APTITUDE VALUES (3,'Tacle',1)
    INSERT INTO APTITUDE VALUES (4,'Marquage',1)
    INSERT INTO APTITUDE VALUES (5,'Tête',1)
    INSERT INTO APTITUDE VALUES (6,'Dribble',1)
    INSERT INTO APTITUDE VALUES (7,'Centre',1)
    INSERT INTO APTITUDE VALUES (8,'Combativité',2)
    INSERT INTO APTITUDE VALUES (9,'Collectif',2)
    INSERT INTO APTITUDE VALUES (10,'Créativité',2)
    INSERT INTO APTITUDE VALUES (11,'Influence',2)
    INSERT INTO APTITUDE VALUES (12,'Placement',2)
    INSERT INTO APTITUDE VALUES (13,'Vitesse',3)
    INSERT INTO APTITUDE VALUES (14,'Force',3)
    INSERT INTO APTITUDE VALUES (15,'Saut',3)
    INSERT INTO APTITUDE VALUES (16,'Plongeon',4)
    INSERT INTO APTITUDE VALUES (17,'Réactivité',4)
    INSERT INTO APTITUDE VALUES (18,'Arrêt aérien',4)
     
    INSERT INTO POSSEDER VALUES (1,1,14)
    INSERT INTO POSSEDER VALUES (1,2,19)
    INSERT INTO POSSEDER VALUES (1,5,20)
    INSERT INTO POSSEDER VALUES (1,6,16)
    INSERT INTO POSSEDER VALUES (1,8,12)
    INSERT INTO POSSEDER VALUES (1,9,14)
    INSERT INTO POSSEDER VALUES (1,10,9)
    INSERT INTO POSSEDER VALUES (1,11,7)
    INSERT INTO POSSEDER VALUES (1,12,10)
    INSERT INTO POSSEDER VALUES (1,13,13)
    INSERT INTO POSSEDER VALUES (1,14,16)
    INSERT INTO POSSEDER VALUES (1,15,14)
     
    INSERT INTO POSSEDER VALUES (2,1,12)
    INSERT INTO POSSEDER VALUES (2,3,15)
    INSERT INTO POSSEDER VALUES (2,4,20)
    INSERT INTO POSSEDER VALUES (2,6,11)
    INSERT INTO POSSEDER VALUES (2,8,16)
    INSERT INTO POSSEDER VALUES (2,9,11)
    INSERT INTO POSSEDER VALUES (2,10,5)
    INSERT INTO POSSEDER VALUES (2,11,9)
    INSERT INTO POSSEDER VALUES (2,12,13)
    INSERT INTO POSSEDER VALUES (2,13,15)
    INSERT INTO POSSEDER VALUES (2,14,18)
    INSERT INTO POSSEDER VALUES (2,15,11)
    Ma requête est la suivante:
    Je veux tous les libellés(même ceux ou il n'y pas de note) et les notes du joueur de code 1 seulement du type aptitude 1.
    De manière à avoir le résultat suivant:

    nom | note

    Passe | 14
    Tir | 19
    Tacle | NULL
    Marquage | NULL
    Tête | 20
    Dribble | 16
    Centre | NULL

  6. #6
    Membre confirmé Avatar de agemis31
    Profil pro
    DBA
    Inscrit en
    Octobre 2007
    Messages
    399
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : DBA

    Informations forums :
    Inscription : Octobre 2007
    Messages : 399
    Points : 478
    Points
    478
    Par défaut Lire la doc
    Bonjour,

    Je te conseille vivement de lire la doc sur les jointures.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT APTITUDE.nom, POSSEDER.note
    FROM JOUEUR 
    CROSS JOIN APTITUDE  
    LEFT JOIN  POSSEDER ON APTITUDE.code = POSSEDER.codeaptitude
    WHERE 
    	JOUEUR.code = ISNULL(POSSEDER.codeJoueur, 1)
    AND typeA = 1
    @+

  7. #7
    Membre du Club
    Inscrit en
    Juin 2008
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 70
    Points : 59
    Points
    59
    Par défaut
    Encore un problème...

    Ce code marche uniquement s'il n'y a qu'un joueur dans la BDD, évidement je n'en ai pas qu'un seul, j'en ai une bonne trentaine, et la requête ne donne plus du tout le même résultat.

    Je vais éditer mon 3e message afin de rajouter un joueur dans le jeu d'essai.

    PS: j'avais lu la doc sur les jointures avant même de poster.

  8. #8
    Membre confirmé Avatar de agemis31
    Profil pro
    DBA
    Inscrit en
    Octobre 2007
    Messages
    399
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : DBA

    Informations forums :
    Inscription : Octobre 2007
    Messages : 399
    Points : 478
    Points
    478
    Par défaut Ok
    Bonsoir,

    Alors autant pour moi pour la doc, d'autant que ma requête était fausse

    Et ceci ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT JOUEUR.code, APTITUDE.nom, ISNULL(POSSEDER.note,0)
    FROM JOUEUR
    CROSS 
    JOIN APTITUDE
    LEFT JOIN POSSEDER ON JOUEUR.code = POSSEDER.codejoueur AND APTITUDE.code = POSSEDER.codeaptitude 
    WHERE  typeA = 1 -- AND  JOUEUR.code = 35
    @+

  9. #9
    Membre du Club
    Inscrit en
    Juin 2008
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 70
    Points : 59
    Points
    59
    Par défaut
    Cette fois ci on y est, merci bien.

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

Discussions similaires

  1. Problème sur les jointures externes
    Par crashtib dans le forum SQL
    Réponses: 2
    Dernier message: 11/01/2011, 15h57
  2. [Oracle] Tris sur des jointure externes
    Par roychris dans le forum Langage SQL
    Réponses: 6
    Dernier message: 28/04/2006, 05h25
  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. Débutant SQL, problème sur une jointure censée exclure ??
    Par derfatypik dans le forum Langage SQL
    Réponses: 8
    Dernier message: 22/06/2005, 15h55
  5. Réponses: 6
    Dernier message: 20/09/2004, 15h26

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