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
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 386
    Points
    18 386
    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 : 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
    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'}.

  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

  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 : 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
    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.

  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 849
    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 849
    Points : 52 978
    Points
    52 978
    Billets dans le blog
    6
    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 +

  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 : 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
    Exact Ô Grand Maître !

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