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 :

Aide sur une sous-requête


Sujet :

Développement SQL Server

  1. #1
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 073
    Points : 9 853
    Points
    9 853
    Billets dans le blog
    5
    Par défaut Aide sur une sous-requête
    Bonjour,

    je dispose d'une table qui héberge des tâches de traitement

    Les champs de cette table sont les suivants :

    IDENTIFIANT | DATE_CLOTURE | DATE_TRAITEMENT | GROUPE | PARENT


    Chaque tâche dispose d'un IDENTIFIANT unique.
    Une tâche peut-être une "sous-tâche" d'une tâche mère.

    - si la tâche est une tâche mère alors IDENTIFIANT = PARENT
    - si la tâche est une sous-tâche alors PARENT = IDENTIFIANT de la tâche mère


    Je cherche à obtenir les tâches mère pour lesquelles :

    - la date de clôture et traitement est vide
    - le groupe est "TOTO" (par exemple)
    - l'ensemble de ses sous-tâches ont une DATE_CLOTURE et DATE_TRAITEMENT non vide

    j'arrive à isoler les tâches mère sur les deux première conditions, mais je n'arrive pas à isoler celles où les tâches enfants ont une DATE_CLOTRE et DATE_TRAITEMENT (la dernière condition).

    Je pense avoir monté la requête à l'envers en débutant par la recherche des tâches mères, et suis bloqué sur la façon de rédiger la sous-requête


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    select 
    	IDENTIFIANT
           ,GROUPE
    from
    	MATABLE
    where  
    	IDENTIFIANT = PARENT
        and GROUPE = 'TOTO'
        and DATE_CLOTURE is null
        and DATE_TRAITEMENT is null

  2. #2
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 154
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    En pseudo code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select 
    from parent
    where groupe = 'toto'
    and not exists (select from filles where lien avec parent and (date_cloture is null or date_traitement is null))
    On ne jouit bien que de ce qu’on partage.

  3. #3
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 073
    Points : 9 853
    Points
    9 853
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    merci de m'avoir mis sur la piste !

    Très novice en SQL (autodidacte), je ne connaissais pas trop le exists.

    J'ai peut-être mal expliqué les choses, mais en fait il fallait faire un exists et pas un not exists


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT T1.IDENTIFIANT
    FROM MATABLE AS T1
    WHERE T1.GROUPE = 'TOTO'
    AND (T1.DATE_CLOTURE IS NULL OR T1.DATE_TRAITEMENT IS NULL)
    AND EXISTS(SELECT *
    	   FROM MATABLE
    	   WHERE (MATABLE.DATE_CLOTURE IS NOT NULL OR MATABLE.DATE_TRAITEMENT IS NOT NULL)
    	     AND MATABLE.PARENT = T1.IDENTIFIANT
    			 			 )

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 937
    Points : 4 358
    Points
    4 358
    Par défaut
    Votre dernière version donne peut-être le résultat que vous voulez mais pas le résultat de votre énoncé original :
    elle vous retourne les parents qui ont AU MOINS 1 enfant avec une date de cloture OU une date de traitement non "vide"
    pas les parents dont TOUS les enfants ont les 2 dates remplies.

  5. #5
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 154
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par joe.levrai Voir le message
    J'ai peut-être mal expliqué les choses, mais en fait il fallait faire un exists et pas un not exists
    "Les tâches mères pour lesquelles toutes les tâches sont non nulles" peut-être reformulé en "Les tâches mères pour lesquelles il n'existe pas de tâche fille nulle".

    C'est pour ça que la solution que j'ai proposé fait un "not exists".

    Si vous voulez tester votre formulation il faut compter les tâches filles, ainsi que les tâches filles sans null, puis avec un having comparer les deux nombre pour ne retenir que les mères pour lesquelles il sont égaux. C'est moins simple à écrire (je trouve) et d'un point de vue algorythme/performances plus lourd pour le SGBD (ma solution écarte les mères à la première ligne fille ne correspondant pas, donc on ne lit pas toutes les filles, alors que votre demande nécessite de tout lire, faire des caculs, puis ensuite filtrer.

    De manière généralement "having" doit être évité, car nécessite des opérations "post processing" et est donc généralement bien plus lent. Accessoirement ma requête commence à retourner des lignes immédiatement, le having nécessite que tous les résultats de la requête aient été évalué pour obtenir une requête, donc en cas de traitement asynchrone, la réponse initiale arrivera bien plus tard.
    On ne jouit bien que de ce qu’on partage.

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

Discussions similaires

  1. Erreur sur une sous requête
    Par Nikimizi dans le forum Langage SQL
    Réponses: 2
    Dernier message: 26/07/2013, 11h58
  2. Problème sur une sous-requête
    Par benoiteuskadi dans le forum Langage SQL
    Réponses: 2
    Dernier message: 04/02/2013, 15h45
  3. erreur sur une sous requête
    Par xavier81 dans le forum Développement
    Réponses: 10
    Dernier message: 15/03/2011, 14h11
  4. Jointure externe sur une sous-requête
    Par pgentils dans le forum Langage SQL
    Réponses: 2
    Dernier message: 29/01/2008, 09h34
  5. REGEXP sur une sous requête :s
    Par GrimR dans le forum Langage SQL
    Réponses: 4
    Dernier message: 25/08/2006, 20h22

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