Bonjour,
Je voudrais pouvoir retourner la liste de tous les contrats de la table TContrat qui ont le service A et B et C correspondant au champs CService.
Merci !
Bonjour,
Je voudrais pouvoir retourner la liste de tous les contrats de la table TContrat qui ont le service A et B et C correspondant au champs CService.
Merci !
On n'est pas dans l'optimisation de requête là, on est plutôt dans les devoirs scolaires ?
Qu'avez-vous commencé à écrire ?
J'ai fait des select avec des union et j'ai utilisé aussi la fonction exists 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 select * from TContrat where CService in ('A', 'B', 'C') select * from TContrat where exists (select 1 from TContrat where CService in ('A', 'B', 'C')) select * from TContrat where EXISTS (select 1 from TContrat where CService='A') and EXISTS (select 1 from TContrat where CService='B') and EXISTS (select 1 from TContrat where CService ='C') select * from TContrat where CService ='A' union select * from TContrat where CService='B' union select * from TContrat where CService='C'
La première requête semble suffisante, pour autant que le besoin soit sorrectement exprimé.
Vos requêtes donnent les contrats pour lesquels la colonne Cservice a une valeur comprise dans l'ensemble {'A', 'B', 'C'}.
Au risque de dire une boulette je dirais que c'est la 1ère la plus optimisée, faisons les comptes (en partant de la fin pour le suspense)
Code SQL :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 SELECT * FROM TContrat WHERE CService LIKE 'A' UNION SELECT * FROM TContrat WHERE CService LIKE 'B' UNION SELECT * FROM TContrat WHERE CService LIKE 'C'
(Note préférer les LIKE aux = pour les comparaisons de chaines)
Là on a 3 Select et 2 Union
Code SQL :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 SELECT * FROM TContrat WHERE EXISTS (SELECT 1 FROM TContrat WHERE CService LIKE 'A') AND EXISTS (SELECT 1 FROM TContrat WHERE CService LIKE 'B') AND EXISTS (SELECT 1 FROM TContrat WHERE CService LIKE 'C')
Là on a 1 requête avec 3 sous-requêtes (avec le bricolage du SELECT 1 qui est pas top à mon goût)
Code SQL :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 SELECT * FROM TContrat WHERE EXISTS (SELECT 1 FROM TContrat WHERE CService IN ('A', 'B', 'C'))
Là toujours 1 requête avec plus qu'1 sous-requête (et toujours le même bricolage)
Code SQL :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 SELECT * FROM TContrat WHERE CService IN ('A', 'B', 'C')
Là plus qu'1 seule requête avec une condition, simple à lire (et à maintenir) et je m'avance peut-être mais je dirais simple à exécuter
Rajout: Bon CinePhil a déjà répondu, mais j'ai pris le temps de rédiger ça alors tant pis![]()
Et si je souhaite retourner les contrats qui ont les 3 services en même temps.
Merci!
Ceci se traduit par :
Les contrats dont le service est inclu dans l'ensemble { 'A', 'B', 'C'} et dont le nombre de lignes correpondant à cette condition est égal à 3.
Il faut donc compter et grouper :
Remplacez id_contrat par le vrai nom de votre colonne identifiant le contrat.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 SELECT id_contrat FROM TContrat WHERE CService IN ('A', 'B', 'C') GROUP BY id_contrat HAVING COUNT(*) = 3
Petite erreur Cinephil... Si un même contrat à comme service A, A et C, ta requête le renverra ! Ce qui est faux. Il faut donc faire :
A +
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 SELECT id_contrat FROM TContrat WHERE CService IN ('A', 'B', 'C') GROUP BY id_contrat HAVING COUNT( DISTINCT CService ) = 3
Exact Ô Grand Maître !![]()
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager