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

SQL Oracle Discussion :

Bug requete SQL


Sujet :

SQL Oracle

  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 Bug requete SQL
    Bonjour,

    Je suis entrain de faire une requête SQL et celle-ci ne me retourne pas le bon résultat. En effet, elle est censé me retourner 1 au lieu de 0 comme elle le fait actuellement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    	SELECT COUNT(DISTINCT idVol) INTO nbVol FROM VOL
    	JOIN MISSION ON VOL.idMission = MISSION.idMission
    	JOIN ESCALE ON MISSION.idMission = ESCALE.idMission
    	WHERE TRUNC(dateVol) = '17/05/15'
    	AND ((villeDepart = 'Paris' AND villeArrivee = 'Marseille')
    	OR (villeDepart = 'Paris' AND ville = 'Marseille')
    	OR (ville = 'Paris' AND ville = 'Marseille')
    	OR (ville = 'Paris' AND villeArrivee = 'Marseille'))
    	AND ((TO_DATE(TO_CHAR(heureDepart,'HH24:MI'),'HH24:MI') = TO_DATE('11:00' ,'HH24:MI'))
    	OR (TO_DATE(TO_CHAR(ESCALE.heureArrivee,'HH24:MI'),'HH24:MI') = TO_DATE('11:00','HH24:MI')));
    En effet, il s'agit d'une mission avec deux escale et là, les villes choisit sont les ville des escales.
    Je pense que le problème provient de l'heure car il ne sait quelle heure choisir pour l'escale.
    L'heure que je donne, c'est l'heure de la première escale, c'est-à-dire Paris ici.
    Il faudrait prendre l'heure de la ville qui se trouve à gauche dans la condition

    Je peut aussi avoir des missions avec une seule escale et dans ce cas, on prendra par exemple comme condition villeDepart et ville pour tester.
    Mais également des missions avec 3, 4 escales.

    Merci de votre aide

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Bonjour,
    Sans le descriptif des tables (surtout que certaines colonnes ne sont pas préfixées dans la requête), un jeu de test et le résultat attendu, je ne vois pas trop comment répondre à la question...

    Je ne comprends pas non plus "Il faudrait prendre l'heure de la ville qui se trouve à gauche dans la condition", ni le "SELECT INTO", ni l'utilisation de conversion date > chaine > date pour tester les heures...

    Tatayo.

  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
    Ce que je cherche c'est s'il existe un vol qui contient au moins ces ville là donc l'heure tester est égale à l'heure de départ ou d'une escale.

    Par exemple, les ville que j'ai mi ici correspondent à deux d'un vol qui contient 3 escale et une ville de départ et d'arrivé.

    L'heure passé est l'heure de départ de l'escale Paris

    Table mission:
    -idMission
    -villeDepart
    -villeArrivee
    -heureDepart
    -heureArrivee

    Table escale:
    -idEscale
    -ville
    -heureArrivee
    -idMission

    Table vol:
    -idVol
    -dateVol
    -idMission

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Il manque toujours un jeu d'essai et le résultat attendu...
    Mais je vois déjà un problème, puisque cette condition ne sera jamais remplie:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ...
    OR (ville = 'Paris' AND ville = 'Marseille')
    ...

    Et si je comprends bien le schéma, dans le cas d'un vol direct il n'y a pas de ligne dans la table escale qui corresponde. Donc une jointure interne avec la table ESCALE fait que les vols directs sont ignorés.

    Enfin, pour les escales seul l'heure d'arrivée est renseignée, par l'heure de départ, ce qui contredit "L'heure passé est l'heure de départ de l'escale Paris".


    Tatayo.

  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
    Oui pour l'escale on prend l'heure d'arriver
    mais sinon la je ne vois pas comment refaire ma requête

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Ce n'est pas faute de demander...
    Citation Envoyé par tatayo Voir le message
    Bonjour,
    ...un jeu de test et le résultat attendu...
    Citation Envoyé par tatayo Voir le message
    Il manque toujours un jeu d'essai et le résultat attendu...
    Tatayo.

  7. #7
    Membre éclairé Avatar de bstevy
    Homme Profil pro
    Solutions Architect
    Inscrit en
    Mai 2009
    Messages
    552
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Japon

    Informations professionnelles :
    Activité : Solutions Architect
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2009
    Messages : 552
    Points : 870
    Points
    870
    Par défaut
    Citation Envoyé par totot Voir le message
    je ne vois pas comment refaire ma requête
    Commencez par changer vos filtres comme l'a dit tatayo

    Si vous dites

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    OR (ville = 'Paris' AND ville = 'Marseille')
    qu'est ce que ca signifie ?
    ca veut dire qu'on doit avoir au même moment VILLE = PARIS = MARSEILLE...
    c'est pas possible. Heureusement que c'est dans un OR.

    Essayez un truc comme ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    where 'PARIS' in (villeDepart , ville)
    and 'MARSEILLE' in (villeArrivee , ville)

    c'est juste une petite modif qui devrait pas changer grand chose, mais c'est sans doute un peu plus logique...



    et sinon, essayez de jouez votre requete petit à petit...
    comme ca, vous verez où ca coince:

    premier etape :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT COUNT(DISTINCT idVol) INTO nbVol FROM VOL
    deuxieme etape:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT COUNT(DISTINCT idVol) INTO nbVol FROM VOL
    JOIN MISSION ON VOL.idMission = MISSION.idMission
    ...

    etc etc

    vous rajoutez une ligne à chaque execution, et vous voyez à partir de quand vous avez votre 0. ca vous aidera à identifier la condition problématique.

  8. #8
    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
    Voilà un jeu d'essais
    Mission:
    - villeDepart : Lille
    - villeArrivee : Nice
    - heureDepart : 10:00
    - heureArrivee : 16:00

    Escale:
    - ville : Paris
    - heureArrivee : 11:00

    - ville: Clermont-Ferrand
    - heureArrivee: 13:00

    - ville: Marseile
    - heureArrivee : 15:00

    Du coup la requête que j'avais fait aurait dû me retourner 1 car les villes que j'ai mis et l'heure que j'ai mi correspondent bien à la mission.

  9. #9
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Si je prends juste les critères sur les villes de ta requête:
    • (villeDepart = 'Paris' AND villeArrivee = 'Marseille') => faux car la ville d'arrivée est Nice et la ville de départ est Lille
    • (villeDepart = 'Paris' AND ville = 'Marseille') => faux car la ville de départ est Lille
    • (ville = 'Paris' AND ville = 'Marseille') => faux car Paris <> Marseille
    • (ville = 'Paris' AND villeArrivee = 'Marseille') => faux car la ville d'arrivée est Nice


    Il est donc normal que la requête renvoie 0.

    Tatayo.

  10. #10
    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
    Je pense que c'est ceci qui bug mais je vois pas comment faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (ville = 'Paris' AND ville = 'Marseille') => faux car Paris <> Marseille

  11. #11
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Peut-être avec 2 jointures sur la table Escale ?
    Quoi qu'il en soit, je pense que le plus simple pour commencer est de séparer les divers cas possibles dans autant de requêtes.
    Ensuite il sera plus facile de voir comment ces divers cas peuvent être regroupés pour ne faire qu'une seule requête.

    Tatayo.

  12. #12
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Vu que tu souhaites les vols non directs (Paris - Marseille dans ton exemple), il faut gérer la liste complète de toutes les villes d'un vol.
    Lille (10:00) -> Paris (11:00) -> Clermont-Ferrand (13:00) -> Marseille (15:00) -> Nice (16:00)
    De plus il faut gérer les heures pour les escales parce que Marseille - Paris départ 15h ne doit pas ressortir.

    En 11g tu peux utiliser Listagg comme ceci
    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
    WITH mission AS (SELECT 1 idmission, 'Lille' villeDepart, 'Nice' villeArrivee, 10 heureDepart, 16 heureArrivee FROM dual),
    escale AS (	SELECT 101 idescale, 'Paris' ville, 11 heureArrivee, 1 idmission FROM DUAL
    UNION ALL SELECT 201 idescale, 'Marseille' ville, 15 heureArrivee, 1 idmission FROM DUAL
    UNION ALL SELECT 301 idescale, 'Clermont-Ferrand' ville, 13 heureArrivee, 1 idmission FROM DUAL
      ),
    vol AS (SELECT 100 idvol, TRUNC(SYSDATE) datevol, 1 idmission FROM dual)
    SELECT * --COUNT(DISTINCT idvol)
    FROM (
    SELECT v.idvol, ','|| m.villeDepart ||'['||m.heureDepart ||'],' ||listagg(e.ville ||'['||e.heureArrivee ||']', ',') WITHIN GROUP (ORDER BY e.heureArrivee) ||','|| m.villeArrivee ||'['||m.heureArrivee ||']' plan_vol
    FROM vol v, mission m, escale e
    WHERE v.datevol = TRUNC(SYSDATE)
    AND m.idmission = v.idmission
    AND e.idmission(+) = m.idmission
    GROUP BY v.idvol, m.villeDepart,m.heureDepart,m.villeArrivee,m.heureArrivee
    )
    WHERE plan_vol LIKE '%,'||:ville_depart || '['|| :heure ||']%'
    AND INSTR(plan_vol, ','|| :ville_arrivee ||'[') > INSTR(plan_vol, ','|| :ville_depart ||'['||:heure ||']') 
     
    IDVOL	PLAN_VOL
    100	,Lille[10],Paris[11],Clermont-Ferrand[13],Marseille[15],Nice[16]
    Sinon, il faut le gérer autrement avec des exists, le mieux est d'avoir la liste complète des villes en une vue (que j'ai nommée Villes)
    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
    WITH mission AS (SELECT 1 idmission, 'Lille' villeDepart, 'Nice' villeArrivee, 10 heureDepart, 16 heureArrivee FROM dual),
    escale AS (	SELECT 101 idescale, 'Paris' ville, 11 heureArrivee, 1 idmission FROM DUAL
    UNION ALL SELECT 201 idescale, 'Marseille' ville, 15 heureArrivee, 1 idmission FROM DUAL
    UNION ALL SELECT 301 idescale, 'Clermont-Ferrand' ville, 13 heureArrivee, 1 idmission FROM DUAL
      ),
    vol AS (SELECT 100 idvol, TRUNC(SYSDATE) datevol, 1 idmission FROM dual),
    villes AS (
    SELECT v.idvol, e.ville, e.heureArrivee heure
    FROM vol v, mission m, escale e
    WHERE v.datevol = TRUNC(SYSDATE)
    AND m.idmission = v.idmission
    AND e.idmission(+) = m.idmission
    UNION ALL
    SELECT v.idvol, m.villeDepart, m.heureDepart FROM vol v, mission m WHERE v.datevol = TRUNC(SYSDATE) AND m.idmission = v.idmission
    UNION ALL
    SELECT v.idvol, m.villeArrivee, m.heureArrivee FROM vol v, mission m WHERE v.datevol = TRUNC(SYSDATE) AND m.idmission = v.idmission)
    SELECT * FROM villes v
    WHERE v.ville = 'Paris'
    AND v.heure = 11
    AND EXISTS (SELECT 1 FROM Villes v2 WHERE v2.idvol = v.idvol AND v2.ville = 'Marseille' AND v2.heure > v.heure)
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

Discussions similaires

  1. [PDO] requete SQL qui bug
    Par thebarbarius dans le forum PHP & Base de données
    Réponses: 10
    Dernier message: 05/10/2012, 16h49
  2. [VB 2005] bug dans Requete SQL
    Par tofque dans le forum VB.NET
    Réponses: 6
    Dernier message: 20/02/2008, 17h50
  3. bug sur requete sql
    Par Willygramme dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 28/08/2007, 12h36
  4. Paramètre requete SQL (ADOQuery)
    Par GaL dans le forum C++Builder
    Réponses: 3
    Dernier message: 30/07/2002, 11h24
  5. Resultat requete SQL
    Par PierDIDI dans le forum Bases de données
    Réponses: 2
    Dernier message: 23/07/2002, 13h43

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