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 :

Optimisation requête sql Oracle


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Inscrit en
    Août 2009
    Messages
    273
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 273
    Points : 46
    Points
    46
    Par défaut Optimisation requête sql Oracle
    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 !

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    On n'est pas dans l'optimisation de requête là, on est plutôt dans les devoirs scolaires ?

    Qu'avez-vous commencé à écrire ?

  3. #3
    Membre du Club
    Inscrit en
    Août 2009
    Messages
    273
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 273
    Points : 46
    Points
    46
    Par défaut
    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'

  4. #4
    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 : 60
    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 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    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 !

  5. #5
    Membre chevronné
    Avatar de Sehnsucht
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Points : 2 209
    Points
    2 209
    Par défaut
    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.

  6. #6
    Membre du Club
    Inscrit en
    Août 2009
    Messages
    273
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 273
    Points : 46
    Points
    46
    Par défaut
    Et si je souhaite retourner les contrats qui ont les 3 services en même temps.

    Merci!

  7. #7
    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 : 60
    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 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par Jinkas Voir le message
    Et si je souhaite retourner les contrats qui ont les 3 services en même temps.
    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 :
    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
    Remplacez id_contrat par le vrai nom de votre colonne identifiant le contrat.
    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 !

  8. #8
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 759
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 759
    Points : 52 540
    Points
    52 540
    Billets dans le blog
    5
    Par défaut
    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 :

    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
    A +
    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/ * * * * *

  9. #9
    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 : 60
    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 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    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 !

Discussions similaires

  1. Réponses: 4
    Dernier message: 06/08/2014, 18h07
  2. optimisation requête SQL
    Par marti dans le forum Oracle
    Réponses: 4
    Dernier message: 27/04/2006, 08h54
  3. Réponses: 2
    Dernier message: 04/03/2006, 10h47
  4. Besoin d'aide pour optimiser requête SQL
    Par Keuf95 dans le forum Langage SQL
    Réponses: 10
    Dernier message: 06/09/2005, 16h02
  5. optimisation requête SQL!!! help!!
    Par anathem62 dans le forum Requêtes
    Réponses: 2
    Dernier message: 24/05/2004, 16h26

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