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 ?
Email : http://scr.im/waldar
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'}.
Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
« 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 la suite Linux Mageïa !
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
Nous sommes tous plus ou moins geek : ce qui est inutile nous est parfaitement indispensable ( © Celira )
À quelle heure dormez-vous ?
Censément, quelqu'un de sensé est censé s'exprimer sensément.
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
Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
« 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 la suite Linux Mageïa !
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
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
* * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *
Exact Ô Grand Maître !
Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
« 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 la suite Linux Mageïa !
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