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 :

Simplification de requête


Sujet :

Langage SQL

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 51
    Points : 34
    Points
    34
    Par défaut Simplification de requête
    Bonjour,

    J'ai une table comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    NOM     Unite
    Dupont    A
    Dupont    B
    Dupont    A
    Durand    B
    Durand    C
    Durand    A
    Et je voudrais selectionner tous les enregistrements des personnes passées dans l'unité "C" par exemple.
    J'ai donc fait une requête avec une sous-requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT * FROM table where NOM IN
    (SELECT NOM FROM table WHERE Unite='C')
    Avec comme résultat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    NOM     Unite
    Durand    B
    Durand    C
    Durand    A
    Mais comme ma base est assez importante, ça rame un peu...

    Je voulais donc savoir si quelqu'un avait une idée pour optimiser ça ??

    Je pensais à un INNER JOIN mais comme mon niveau de SQL est assez léger je ne trouve pas...

  2. #2
    Membre émérite Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Points : 2 520
    Points
    2 520
    Par défaut
    Bonjour,

    Tu peux utiliser les alias, de mémoire ceci devrait être bon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT *
    FROM MaTable t1
        JOIN MaTable t2
        ON t1.nom = t2.nom
    WHERE t2.unite = 'C'
    Tu n'as pas un identifiant pour faire le lien ? Ça serait plus efficace.
    Essaye de voir aussi du côté de tes index.
    ~ Lola ~

  3. #3
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Bonjour,

    hormis le problème de modélisation, la méthode est bonne.

    Ici vous devriez avoir pour le MCD :
    Personne-0,n----Possede----0,n-Etat

    => MPD :
    personne (id_per, ...)
    Etat(id_eta, valeur, ...)
    a_per_eta(#id_per, #id_eta)

    La requête ne changerai pas mais vous ferriez une jointure sur un integer, ce qui serai beaucoup plus rapide que de comparer des varchar sur une table conséquente ...


    Sinon essayez de poser 2 indexs :
    - un sur : unite, nom
    - un sur : nom

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 778
    Points
    30 778
    Par défaut
    Dans ton cas, tu peux passer par INNER JOIN ou par EXISTS :

    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  DISTINCT tb1.*
    FROM    TABLE   tb1
        INNER JOIN
            TABLE   tb2 
            ON  tb1.NOM = tb2.NOM
    WHERE   tb2.Unite = 'C'
    ;
    SELECT  tb1.*
    FROM    TABLE   tb1
    WHERE   EXISTS
            (   SELECT  1
                FROM    TABLE   tb2
                WHERE   tb2.Unite = 'C'
                    AND tb1.NOM = tb2.NOM
            )
    ;
    Quant à ton niveau de SQL, tu peux l'améliorer en passant par .
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  5. #5
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Salut,

    Ta requête est à priori au moins aussi bien que toutes les autres qui te sont proposées...

    => Il faut regarder ton plan d'exécution, et poser éventuellement des index (comme le suggère Punkoff. Mais d'abord regarder le plan d'exécution et les volumétriées).

    (c'est ma photo)
    Paku, Paku !
    Pour les jeunes incultes : non, je ne suis pas un pokémon...

    Le pacblog : http://pacmann.over-blog.com/

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 51
    Points : 34
    Points
    34
    Par défaut
    Merci de vos réponses

    Alors j'ai testé la requete de Lola et elle est en tout cas plus rapide !

    Maintenant, je suis en train de tester si les resultats sont bon

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 51
    Points : 34
    Points
    34
    Par défaut
    Bon ben j'ai encore un problème...

    En fait, l'exemple cité plus haut était volontairement (trop) simplifié...

    En fait la table ressemble à ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    NOM     CMD  Unite
    Dupont    14    A
    Dupont    14    B
    Dupont    14    A
    Durand    10    B
    Durand    10    C
    Durand    10    A
    Dubois    15    B
    Dubois    15    C
    Dubois    15    A
    Et je voudrais récupérer tous les enregistrements qui ont :
    CMD=14 ou CMD=15 ou Unite=C

    Et la requete suivante me donne des doublons

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT *
    FROM MaTable t1
        JOIN MaTable t2
        ON t1.nom = t2.nom
    WHERE t2.CMD IN (14,15) OR t2.unite = 'C'
    Et je précise que je suis sur Access...
    J'entend d'ici vos *Booooooooooo* de désaprobation mais sachez que je n'y suis pour rien

    Et en ce qui concerne les index (clés de tables ?) ben je n'en ai pas non plus...
    Inutile de dire que je ne peut bien évidemment pas la modifier...

  8. #8
    Membre émérite Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Points : 2 520
    Points
    2 520
    Par défaut
    Du coup quel est le résultat que tu veux obtenir ?
    Et quel est le résultat que tu obtiens réellement ?
    ~ Lola ~

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 51
    Points : 34
    Points
    34
    Par défaut
    Et bien pour les enregistrements "Dupont" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    NOM     CMD  Unite
    Dupont    14    A
    Dupont    14    B
    Dupont    14    A
    J'obtiens :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    NOM     CMD  Unite
    Dupont    14    A
    Dupont    14    A
    Dupont    14    A
    Dupont    14    B
    Dupont    14    B
    Dupont    14    B
    Dupont    14    A
    Dupont    14    A
    Dupont    14    A
    Alors que je voudrais obtenir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    NOM     CMD  Unite
    Dupont    14    A
    Dupont    14    B
    Dupont    14    A
    Alors j'ai ajouté un DISTINCT et là ça marche... mais c'est pas un peu dégeu comme solution ?

  10. #10
    Membre émérite Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Points : 2 520
    Points
    2 520
    Par défaut
    J'irai pas jusqu'à dire que c'est une solution degeu comme tu dis.

    Ne peux-tu pas faire la jointure sur une clé primaire plutôt ? C'est mieux dans tous les cas.
    ~ Lola ~

  11. #11
    Membre chevronné
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Points : 1 806
    Points
    1 806
    Par défaut
    Une jointure sur la clé primaire de la même table ? Autant mettre directement la condition

    Dans ce cas là, utilisez EXISTS tel que proposé par al1_24. Et, à l'instar des personnes me précédant, je suggère de regarder du côté des index si les temps de réponse sont problématiques !

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 51
    Points : 34
    Points
    34
    Par défaut
    Comme je ne peut pas créer de clé primaire, je crois que je vais en rester là...

    Le DISTINCT marche, c'est déjà ça.

    En tous cas merci à vous

  13. #13
    Membre émérite Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Points : 2 520
    Points
    2 520
    Par défaut
    Citation Envoyé par Rei Ichido Voir le message
    Une jointure sur la clé primaire de la même table ? Autant mettre directement la condition

    Dans ce cas là, utilisez EXISTS tel que proposé par al1_24. Et, à l'instar des personnes me précédant, je suggère de regarder du côté des index si les temps de réponse sont problématiques !
    J'ai dit clé primaire mais je pensais identifiant de l'individu

    Vivement ce week-end
    ~ Lola ~

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [10g] Simplification de requête
    Par alexis trotta dans le forum SQL
    Réponses: 4
    Dernier message: 24/10/2013, 17h34
  2. Simplification de requêtes SQL
    Par XGuarden dans le forum VB.NET
    Réponses: 8
    Dernier message: 30/12/2010, 12h31
  3. Simplification de requête
    Par Louis-Guillaume Morand dans le forum SQL
    Réponses: 21
    Dernier message: 03/03/2008, 13h26
  4. simplification de requête
    Par GMI3 dans le forum Oracle
    Réponses: 3
    Dernier message: 03/05/2006, 15h47
  5. [Access] simplification de requètes.
    Par pmboutteau dans le forum Langage SQL
    Réponses: 14
    Dernier message: 02/02/2006, 10h04

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