Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 15/12/2010, 16h53   #1
Invité de passage
 
Pierre Lesecq
Inscription : décembre 2010
Messages : 8
Détails du profil
Informations personnelles :
Nom : Pierre Lesecq

Informations forums :
Inscription : décembre 2010
Messages : 8
Points : 0
Points : 0
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 :
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
passpartout007 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2010, 20h09   #2
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 638
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 638
Points : 2 630
Points : 2 630
Bonjour,

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

Code :
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.
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2010, 01h19   #3
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 977
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 10 977
Points : 18 221
Points : 18 221
Envoyer un message via MSN à CinePhil
Ou bien comme ça :
Code :
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
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 04h54.


 
 
 
 
Partenaires

Hébergement Web