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 :

Fusion de deux requetes sur une même table


Sujet :

Langage SQL

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 130
    Points : 127
    Points
    127
    Par défaut Fusion de deux requetes sur une même table
    Bonjour à tous.

    J'ai eux requêtes différentes qui sont les suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select count(mdcod) as cnt from immanda where mdtyp = 1 and mddeb like '200701%'
     
    select count(mdcod) as cnt from immanda where mdtyp = 3 and mddeb like '200701%'
    Elles sont correctes et me donnent bien le résultat que je recherche.

    Cependant, elle se trouvent dans une boucle qui est assez longue à exécuter, j'essaie donc d'optimiser les traitements.

    J'aimerai donc commencer par réunir ces deux quêtes pour obtenir les deux chiffres que je recherche dans le même résultat d'une seule requête. (j'espère être assez clair).

    Je cherche en vain depuis deux jours ...

    Si quelqu'un a une idée, je l'en remercie d'avance.

    Précision: tout ceci se passe sur des bases Hyperfile, format propriétaire de PCSoft.

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 93
    Points : 87
    Points
    87
    Par défaut
    Bonjour,

    est-ce-que cette requête répond à vos besoins :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT count(mdcod) AS cnt
    FROM immanda
    WHERE
       ( mdtyp = 1 OR mdtyp = 3 )
    AND
       ( mddeb LIKE '200701%' );

  3. #3
    Futur Membre du Club
    Inscrit en
    Mai 2007
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 5
    Points : 6
    Points
    6
    Par défaut
    Salut,

    Je ne suis pas sur que c'est cela qu'il souhaite obtenir. La tu additionnes les uplets qui ont mdtyp = 1 ou mdtyp = 3.

    Je vois plutôt comme cela

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT count( * )
    FROM immanda
    WHERE ( mdtyp = 1 OR mdtyp = 3) AND
       ( mddeb LIKE '200701%' )
    GROUP BY mdtyp;
    Ainsi, il obtient deux lignes de résultats.
    A tester quand même

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 93
    Points : 87
    Points
    87
    Par défaut
    Ah oui je pense que tu as raison !

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 130
    Points : 127
    Points
    127
    Par défaut
    Salut à vous, merci pour vos réponses.

    La requête de Ijnei correspond bien à ce dont j'ai besoin, merci beaucoup.

    J'ai bien compris que c'est ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ( mdtyp = 1 OR mdtyp = 3)
    qui fait qu'il y a deux lignes.
    Mais j'aimerai juste comprendre la logique qu'il y a là-dessous, car comme ça à l'oeil nu, je ne la vois pas :p

    Si quelqu'un peut éclairer ma lanterne.

    Merci encore

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 93
    Points : 87
    Points
    87
    Par défaut
    Et bien cette condition te permet de ne garder que les enregistrements pour lesquels le champ mdtyp vaut 1 OU 3.

    De plus s'il y a des parenthèses, c'est pour respecter la "priorité des conditions" si l'on peut dire. Ainsi comme en maths, en SQL on effectue d'abord ce qu'il y a dans les parenthèses, puis ce qu'il y a autour.

    Si tu enlèves les parenthèses et que tu écris :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    WHERE mdtyp = 1
    OR mdtyp = 3
    AND mddeb LIKE '200701%'
    La requête retiendra les enregistrements :
    • qui ont un champ mdtyp valant 1 (sans tenir compte du champ mddeb)
    • qui ont un mdtyp valant 3 ET un mddeb commençant par '200701'


    Sans les parenthèses le OR sépare la condition en deux, alors que toi tu as une condition commune à tes deux requêtes (la valeur de mddeb) et une condition qu'il faut "fusionner" (mdtyp valant 1 ou 3).

    Pour résoudre ce problème, il faut utiliser les parenthèses qui vont permettre de dire au SGBD :
    • "Attention je veux que tu tiennes compte du champ mddeb pour la valeur 1 et 3, et pas uniquement pour la valeur 3"


    J'espère avoir été clair

    [EDIT]

    Une autre manière de voir les choses est de dire que grâce aux parenthèses, le SGBD procède comme suit pour trouver les enregistrements correspondants :

    • En premier lieu il cherche les enregistrements pour lesquels la valeur de mdtyp est 1 ou 3
    • Puis, une fois qu'il a trouvé ces enregistrements, il leur applique la deuxième condition portant sur la valeur de mddeb

    C'est une autre façon d'expliquer la priorité des conditions.


    [/EDIT]

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 130
    Points : 127
    Points
    127
    Par défaut
    C'est noté, merci à toi.

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 07/01/2015, 13h48
  2. Requete sur une même table
    Par laipreu dans le forum Requêtes
    Réponses: 1
    Dernier message: 31/05/2008, 21h42
  3. [SQL] Probleme de requete sur une même table
    Par LP-mpascolo dans le forum Langage SQL
    Réponses: 3
    Dernier message: 30/01/2008, 14h02
  4. [AJAX] Gestion de deux listes sur une même table
    Par kabkab dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 19/01/2008, 13h48
  5. [MySQL] Plusieurs même requetes sur une même table
    Par bibom dans le forum PHP & Base de données
    Réponses: 14
    Dernier message: 27/07/2006, 12h54

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