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 :

Utilisation de DISTINCT ou pas ?


Sujet :

Langage SQL

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations forums :
    Inscription : Décembre 2010
    Messages : 8
    Points : 4
    Points
    4
    Par défaut Utilisation de DISTINCT ou pas ?
    Bonjour à tous,

    Voilà, je fais une requête pour trouver des sites clients dont au moins un élément de planning est à l'état 'valide'. Le problème c'est que s'il y a deux éléments de planning validés pour un même site, ma requête retourne deux fois le même site... J'ai bien sûr pensé à DISTINCT mais comme je sélectionne un autre champ en plus du site je suis pas sûr que ça soit possible...
    Au passage, je sélectionne e.* juste pour qu'il accepte mon ORDER BY, mais il doit sûrement y avoir un moyen d'éviter ça ...
    Donc je résume : Il faudrait que cette requête soit modifiée pour ne retourner si possible que des sites différents, mais que ceux-ci soit ordonnée en fonction e.dateDebut

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT  S.* , e.*
    FROM SITE_CLIENT S  
    JOIN ELEMENT_PLANNING e 
    ON e.idSite = S.idSite 
    WHERE EXISTS
    (	
    	SELECT * 
    	FROM ELEMENT_PLANNING EL	
    	JOIN ETAT_PLANNING ET ON ET.idEtatPlanning = EL.idEtat 	
    	WHERE EL.idSite = S.idSite	
    	AND ET.nomEtatPlanning = 'valide' 
    ) 
     
    ORDER BY e.dateDebut ASC
    Si vous avez des idées, please help

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Bonjour,

    A ce stade je vois 1 solution, passer par un group by, du coup le exists devient obsolète.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    with tmp as (
    select e.idSite, max(e.dateDebut) as dateDebutMax
    from ELEMENT_PLANNING e
    inner join ETAT_PLANNING ET ON ET.idEtatPlanning = e.idEtat 
    where ET.nomEtatPlanning = 'valide' 
    group by e.idsite)
     
     
    SELECT  S.* , b.dateDebutMax
    FROM SITE_CLIENT S  
    inner join tmp b on s.idsite = b.idsite
    order by b.dateDebutMax
    Si la structure with ne marche pas intégrez la dans une sous-requête.

    Vous pouvez changer le max en min selon ce que vous voulez comme date.

  3. #3
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Ou bien comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT sc.*, tmp.derniere_date_debut
    FROM SITE_CLIENT sc
    INNER JOIN (
      SELECT S.idSite, MAX(el.dateDebut) AS derniere_date_debut
      FROM SITE_CLIENT S
      INNER JOIN ELEMENT_PLANNING el ON el.idSite = S.idSite
        INNER JOIN ETAT_PLANNING et ON et.idEtatPlanning = el.idEtatPlanning
      WHERE et.nomEtatPlanning = 'valide'
      GROUP BY S.idSite
    ) tmp ON tmp.idSite = sc.idSite
    ORDER BY tmp.derniere_date_debut

Discussions similaires

  1. [MYSQL] [débutant] utiliser replace avec mysql.pas
    Par alex01pernot dans le forum Bases de données
    Réponses: 2
    Dernier message: 30/08/2006, 21h23
  2. Utilisation de Distinct
    Par qwert33 dans le forum Langage SQL
    Réponses: 11
    Dernier message: 23/06/2006, 09h54
  3. [Débutant] Utiliser un SGBD ou pas (VC++) ?
    Par skual dans le forum Débuter
    Réponses: 7
    Dernier message: 30/01/2006, 14h08
  4. Utilisation de DISTINCT
    Par vanmouniren dans le forum Langage SQL
    Réponses: 6
    Dernier message: 05/12/2005, 12h16
  5. Réponses: 12
    Dernier message: 26/10/2005, 15h28

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