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 :

Problème jointure requête SQL


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Débutant  
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 225
    Points : 132
    Points
    132
    Par défaut Problème jointure requête SQL
    Bonjour,

    Je cherche à faire une requête sql qui m'affiche tout les pilote qui n'ont pas était a Annecy. J'ai donc fait la requête suivante mais celle-ci ne me prend pas les pilote qui ne sont pas présent dans la table VOL or elle doit les prendre car ils ont jamais étaient à Annecy.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT nom, prenom, MISSION.idMission, villeDepart, villeArrivee
    FROM PERSONNEL
    LEFT JOIN VOL ON PERSONNEL.idPersonnel = VOL.idPilote
    JOIN MISSION ON MISSION.idMission = VOL.idMission
    JOIN ESCALE ON ESCALE.idMission = MISSION.idMission
    WHERE (villeArrivee != 'Annecy' 
    OR ville != 'Annecy')
    AND fonction = 'Pilote';
    Merci de votre aide

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 154
    Points : 38 950
    Points
    38 950
    Billets dans le blog
    9
    Par défaut
    IL faudrait qualifier la table pour chaque colonne car la provenance des données n'est pas claire, mais la requete pourrait ressembler à ceci
    (j'ai supposé que les villes étaient dans la table "VOL")
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    SELECT PRS.nom, PRS.prenom, MIS.idMission, VOL.villeDepart, VOL.villeArrivee
    FROM PERSONNEL as PRS
    INNER JOIN VOL 
      ON PRS.idPersonnel = VOL.idPilote
    INNER JOIN MISSION as MIS
      ON MIS.idMission = VOL.idMission
    WHERE NOT EXISTS
         (SELECT 1 FROM VOL as SUBQ
          WHERE SUBQ.idPilote = PRS.idPersonnel
            AND (    SUBQ.villeDepart  ='ANNECY'
                 OR  SUBQ.villeArrivee ='ANNECY')
          )

  3. #3
    Débutant  
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 225
    Points : 132
    Points
    132
    Par défaut
    Les ville sont dans la table mission. J'ai essayé de faire ceci mais il me manque toujours un pilote:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT nom, prenom, idPersonnel
    FROM PERSONNEL
    WHERE idPersonnel NOT IN (SELECT idPilote FROM VOL JOIN PERSONNEL ON PERSONNEL.idPersonnel = VOL.idPilote)
    AND fonction = 'Pilote'
    MINUS
    SELECT nom, prenom, idPersonnel
    FROM PERSONNEL
    JOIN VOL ON PERSONNEL.idPersonnel = VOL.idPilote
    JOIN MISSION ON VOL.idMission = MISSION.idMission
    JOIN ESCALE ON MISSION.idMission = ESCALE.idMission
    WHERE (villeArrivee != 'Annecy'
    OR ville != 'Annecy')
    AND villeArrivee != 'Annecy';
    Je ne vois pas ce qu'il manque ou se qui cloche

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 154
    Points : 38 950
    Points
    38 950
    Billets dans le blog
    9
    Par défaut
    Tu ne peux pas trouver les pilotes n'ayant pas été a Annecy en faisant un where ville différent de Annecy :

    si par exemple un pilote a fait un vol vers Toulouse, puis un autre vers Annecy, alors tu vas le sélectionner à cause du 1er vol.

    Ceci devrait correspondre au besoin :

    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
     
       SELECT PRS.nom, PRS.prenom, MIS.idMission, MIS.villeDepart, MIS.villeArrivee
       FROM PERSONNEL as PRS
       LEFT OUTER JOIN VOL 
         ON VOL.idPilote = PRS.idPersonnel 
       INNER JOIN MISSION as MIS
         ON MIS.idMission = VOL.idMission
    -- elimination des pilotes ayant volé au départ ou à destination d'Annecy
       WHERE NOT EXISTS
            (SELECT 1 FROM VOL as VOL1
             WHERE SUBQ.idPilote = PRS.idPersonnel
               AND (    VOL1.villeDepart  ='ANNECY'
                    OR  VOL1.villeArrivee ='ANNECY')
            )
    -- elimination des pilotes ayant fait escale à Annecy
         AND NOT EXISTS
            (SELECT 1 FROM ESCALE as ESC2
             INNER JOIN MISSION   as MIS2
                ON MIS2.idMission = ESC2.idMission
             INNER JOIN VOL       as VOL2 
                ON VOL2.idMission = ESC2.idMission
             WHERE VOL2.idPilote = PRS.idPersonnel
               AND ESC2.ville  ='ANNECY'
            )

  5. #5
    Débutant  
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 225
    Points : 132
    Points
    132
    Par défaut
    Sa ne fonctionne car il m'affiche des gens qui sont déjà aller à Annecy

  6. #6
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 154
    Points : 38 950
    Points
    38 950
    Billets dans le blog
    9
    Par défaut
    Ne serait ce pas simplement un problème de majuscules/minuscules ?
    En ce cas il suffit d'ajouter la conversion en majuscules (upper ou uppercase selon les sgbd) comme suit :

    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
       SELECT PRS.nom, PRS.prenom, MIS.idMission, MIS.villeDepart, MIS.villeArrivee
       FROM PERSONNEL as PRS
       LEFT OUTER JOIN VOL 
         ON VOL.idPilote = PRS.idPersonnel 
       INNER JOIN MISSION as MIS
         ON MIS.idMission = VOL.idMission
    -- elimination des pilotes ayant volé au départ ou à destination d'Annecy
       WHERE NOT EXISTS
            (SELECT 1 FROM VOL as VOL1
             WHERE SUBQ.idPilote = PRS.idPersonnel
               AND (    UPPER(VOL1.villeDepart)  ='ANNECY'
                    OR  UPPER(VOL1.villeArrivee) ='ANNECY')
            )
    -- elimination des pilotes ayant fait escale à Annecy
         AND NOT EXISTS
            (SELECT 1 FROM ESCALE as ESC2
             INNER JOIN MISSION   as MIS2
                ON MIS2.idMission = ESC2.idMission
             INNER JOIN VOL       as VOL2 
                ON VOL2.idMission = ESC2.idMission
             WHERE VOL2.idPilote = PRS.idPersonnel
               AND UPPER(ESC2.ville)  ='ANNECY'
            )
    Sinon, il faut que tu détailles le résultat obtenu et dans quelle(s) table(s) chacune des villes est présente :
    - ville
    - villeDepart
    - villeArrivee

Discussions similaires

  1. Problème de requête SQL avec instruction TRANSFORM
    Par Nosper dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 21/06/2005, 16h15
  2. problème de requète SQL pour formulaire
    Par en_stage dans le forum Requêtes et SQL.
    Réponses: 15
    Dernier message: 21/06/2005, 12h21
  3. [SQL] Problème de requête SQL de plus de 8060 caractères ?
    Par webtheque dans le forum MS SQL Server
    Réponses: 13
    Dernier message: 06/04/2005, 15h07
  4. [SQLserver2000][SQLServer CE] problème de requête SQL
    Par JBernn dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 27/01/2005, 09h29
  5. Problème de requète SQL dans un Requery
    Par Keraccess dans le forum Requêtes et SQL.
    Réponses: 7
    Dernier message: 22/10/2004, 14h58

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