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

Requêtes et SQL. Discussion :

Requete NOT EXISTS retournant un résultat vide


Sujet :

Requêtes et SQL.

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juin 2007
    Messages : 22
    Points : 15
    Points
    15
    Par défaut Requete NOT EXISTS retournant un résultat vide
    Bonjour,

    Depuis 2 jours j'essai de lancer une requete de division (not exists) qui devrais me retourner un résultat hors ce résultat est vide ...

    Je ne vois pas où se trouve mon erreur ... je ne sais pas si il y a des spécificités sur le not exists dans access, enfin voila j'aimerais trouver une solution pour que ma requete marche, voici le code de ma requete :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    SELECT ressources.id_ressource, calendar.year, calendar.month, Count(calendar.day) AS CountOfday
    FROM ressources, calendar
    WHERE (((calendar.year)=Year(date())) AND ((calendar.working_day)=Yes) AND ((calendar.day)))
     
    AND NOT EXISTS (SELECT calendar.day, ressources.id_ressource
    FROM ressources INNER JOIN (calendar INNER JOIN indispo ON calendar.day = indispo.day) ON ressources.id_ressource = indispo.id_ressource
    WHERE (((calendar.year)=Year(date())) AND ((calendar.working_day)=Yes));)
     
     
    GROUP BY ressources.id_ressource, calendar.year, calendar.month;
    Le résultat de ma sous requete me donne bien les jours d'indisponibilité à exclure pour la personne correspondante, voici le code de cette requete :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT calendar.day, ressources.id_ressource
    FROM ressources INNER JOIN (calendar INNER JOIN indispo ON calendar.day = indispo.day) ON ressources.id_ressource = indispo.id_ressource
    WHERE (((calendar.year)=Year(date())) AND ((calendar.working_day)=Yes));
    Et ma première requete récupère tout les jours normalement travaillés pour tout le monde :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT ressources.id_ressource, calendar.year, calendar.month, Count(calendar.day) AS CountOfday
    FROM ressources, calendar
    WHERE (((calendar.year)=[Forms]![Ressources_Dispo_Days]![ActualYear].[value]) AND ((calendar.working_day)=Yes) AND ((calendar.day)))
    GROUP BY ressources.id_ressource, calendar.year, calendar.month;

    En faisant donc une division entre ses 2 requetes je devrais obtenir les jours travaillés moins les jours de congés.

    Hors je n'ai rien, le résultat est vide.

    J'ai testé avec un NOT IN mais jai un message d'erreur qui me dit que je ne peut mettre qu'un champ en "not in", ici j'ai besoin des 2 champs id_ressource et calendar.day car ce sont des couples que je dois écarter.

    Merci par avance pour votre aide.

  2. #2
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Localisation : Sénégal

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 229
    Points : 1 579
    Points
    1 579
    Par défaut
    Citation Envoyé par uptoditime Voir le message
    J'ai testé avec un NOT IN mais jai un message d'erreur qui me dit que je ne peut mettre qu'un champ en "not in", ici j'ai besoin des 2 champs id_ressource et calendar.day car ce sont des couples que je dois écarter.
    D'accord mais le Not In ne s'applique qu'à une seule colonne à la fois.

    Tu peux corriger ton code comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT ressources.id_ressource, calendar.year, calendar.month, Count(calendar.day) AS CountOfday
    FROM ressources, calendar
    WHERE ((calendar.year=Year(date()) AND (calendar.working_day=Yes) AND (calendar.day Not In (SELECT calendar.day FROM ressources INNER JOIN (calendar INNER JOIN indispo ON calendar.day = indispo.day) ON ressources.id_ressource = indispo.id_ressource
    WHERE ((calendar.year=Year(date())) AND (calendar.working_day=Yes))) AND (ressources.id_ressource Not In (SELECT ressources.id_ressource
    FROM ressources INNER JOIN (calendar INNER JOIN indispo ON calendar.day = indispo.day) ON ressources.id_ressource = indispo.id_ressource
    WHERE ((calendar.year=Year(date())) AND (calendar.working_day=Yes))) 
    ))
     
    GROUP BY ressources.id_ressource, calendar.year, calendar.month;

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juin 2007
    Messages : 22
    Points : 15
    Points
    15
    Par défaut
    Bonsoir,

    La requete que tu mas donné ne peut pas marcher, car ça reviendrais a dire :

    Enlever dans les jours travaillés les jours non travaillés des jours des employés qui n'ont pas travaillés, en gros les 2 not in renvoient le meme résultat donc si on les soustraient ils retournent 0 donc ça n'enlève rien à la sélection de base.

    Pour être plus clair j'ai testé les 2 not in séparémment et ils retournent le même résultat.
    De plus j'ai testé la sous requete avec sa sous sous requete et ça ne renvoi aucun enreistrement.
    Voici la sous requete que tu m'as donné (les 2 not in) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT calendar.day 
    FROM ressources INNER JOIN (calendar INNER JOIN indispo ON calendar.day = indispo.day) ON ressources.id_ressource = indispo.id_ressource
    WHERE ((calendar.year=Year(date())) 
    AND (calendar.working_day=Yes) 
    AND (ressources.id_ressource Not In (SELECT ressources.id_ressource
    FROM ressources INNER JOIN (calendar INNER JOIN indispo ON calendar.day = indispo.day) ON ressources.id_ressource = indispo.id_ressource
    WHERE ((calendar.year=Year(date())) 
    AND (calendar.working_day=Yes)
    ))))
    en effet elle ne retourne aucun enregistrement, donc si je l'enlève de la sélection des jours travaillés forcément je n'aurais pas un bon résultat ...

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juin 2007
    Messages : 22
    Points : 15
    Points
    15
    Par défaut
    Re,

    En fait, jai presque réussi enfin j'espère...

    Mais la requête ne fait le calcul que pour un seul employé, en gros on dirais comme si elle ne prends en compte que celui qui à posé le plus de congés et calcul le nombre de jour qu'il lui reste à travailler, ensuite elle attribut ce chiffre à tout le monde...

    Pour l'instant le seul moyen que j'ai trouvé est de passer l'identifiant de l'employé en condition, la ça marche à merveille, mais si je veux la même chose pour tout le monde, j'ai un résultat incohérent ...

    Voici la requete pour avoir le nombre de jours restant a travailler pour tout le monde (donne un résultat incohérent expliqué ci dessus):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT calendar.month, ressources.id_ressource, Count(calendar.day) AS CountOfday
    FROM ressources, calendar
    WHERE (((calendar.day) Not In (SELECT calendar.day 
    FROM ressources INNER JOIN (calendar INNER JOIN indispo ON calendar.day = indispo.day) ON ressources.id_ressource = indispo.id_ressource
    WHERE ((calendar.year=Year(date())) 
    AND (calendar.working_day=Yes)))))
    GROUP BY calendar.month, ressources.id_ressource, calendar.working_day, calendar.year
    HAVING (((calendar.working_day)=Yes) AND ((calendar.year)=Year(Date())));

    et voici celle où je ne sélectionne qu'une personne (celle ci marche très bien) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT ressources.id_ressource, calendar.year, calendar.month, Count(calendar.day) AS CountOfday
    FROM ressources, calendar
    WHERE (((calendar.year)=Year(Date())) AND ((calendar.working_day)=Yes) AND ((calendar.day) Not In (SELECT calendar.day
                                                 FROM ressources INNER JOIN (calendar INNER JOIN indispo ON calendar.day = indispo.day) ON ressources.id_ressource = indispo.id_ressource
                                                 WHERE (((ressources.id_ressource)=Forms![Ressources_Dispo_Days]![ID].value) AND ((calendar.year)=Year(Date())) AND ((calendar.working_day)=Yes)); )) AND ((ressources.id_ressource)=[Forms]![Ressources_Dispo_Days]![ID].[value]))
    GROUP BY ressources.id_ressource, calendar.year, calendar.month;
    Il faut que je puisse obtenir le nombre de jours restants à travailler pour chaque employés en une seule requete, et ne pas avoir à le recalculer pour chaque personne.

    J'espère que quelqu'un pourra m'aider ...

Discussions similaires

  1. [MySQL] Requête retourne un résultat vide dans PHP, OK dans PhpMyAdmin
    Par Lomic dans le forum PHP & Base de données
    Réponses: 10
    Dernier message: 10/01/2014, 18h00
  2. [MySQL-5.5] MySQL a retourné un résultat vide (aucune ligne).
    Par reverb94 dans le forum Débuter
    Réponses: 3
    Dernier message: 27/02/2013, 23h42
  3. [MySQL] Une requete qui ne retourne aucun résultats
    Par amerex dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 23/01/2010, 17h46
  4. Sous requete not exist WEBI
    Par emmanuelle.t dans le forum Webi
    Réponses: 2
    Dernier message: 21/07/2008, 18h47
  5. Requete NOT EXISTS qui ne retourne aucun enregistrements
    Par uptoditime dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 03/12/2007, 15h18

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