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

  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 136
    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 136
    Points : 38 909
    Points
    38 909
    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 136
    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 136
    Points : 38 909
    Points
    38 909
    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 136
    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 136
    Points : 38 909
    Points
    38 909
    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

  7. #7
    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
    En effet, il y avait un problème de majuscule / minuscule.
    En revanche, il ne m'affiche qu'un seul pilote. C'est bien le bon mais il ne m'affiche pas également ceux qui sont dans la table personnel et qui ne se trouvent pas dans la table vol

  8. #8
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 776
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 776
    Points : 52 751
    Points
    52 751
    Billets dans le blog
    5
    Par défaut
    Plutôt que d'utiliser une merdouille avec UPPER, utilisez une COLLATION, c'est SARGABLE !

    Pour les pilotes n'ayant jamais volé, faite un EXCEPT et une concaténation avec UNION ALL

    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
    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   COLLATE French_CI_AI = 'ANNECY'
                    OR  VOL1.villeArrivee COLLATE French_CI_AI = '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  COLLATE French_CI_AI ='ANNECY'
            )
    UNION ALL
    SELECT PRS.nom, PRS.prenom, NULL, NULL, NULL
    FROM PERSONNEL as PRS
    WHERE FONCTION = 'Pilote' --> ou autre chose !!!
    EXCEPT
    SELECT PRS.nom, PRS.prenom, NULL, NULL, NULL
    FROM PERSONNEL as PRS
         INNER JOIN VOL 
         ON VOL.idPilote = PRS.idPersonnel 
    WHERE FONCTION = 'Pilote'
    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  9. #9
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    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 136
    Points : 38 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    il me semble que COLLATE n'est pas implémenté en standard pour toutes les DB, me fourvoyai-je ?

  10. #10
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 776
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 776
    Points : 52 751
    Points
    52 751
    Billets dans le blog
    5
    Par défaut
    Tous les SGBDR possèdent le COLLATE avec plus ou moins d'options, sauf Oracle avec cette innommable merde de NLS !

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

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