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 :

comparaison sur 2 champs en même temps


Sujet :

Langage SQL

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 3
    Points : 2
    Points
    2
    Par défaut comparaison sur 2 champs en même temps
    Bonjour,

    je travaille sur une base oracle et je veux faire une sélection sur 2 champs..
    Ma condition porte sur 2 champ en même temps.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT * 
    FROM TABLE 
    WHERE (chp1=12 AND chp2=0) OR (chp1=22 AND chp2=3);
    Cette requète met énormément de tps à s'exécuté je suis obligé de l'arrêter.

    Qu'est ce qui ne va pas dans la requète?
    Merci de votre aide

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 60
    Points : 55
    Points
    55
    Par défaut
    T'as essayé de formuler ta requete autrement du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT * 
    FROM TABLE 
    WHERE chp1=12 
    AND chp2=0 
    UNION
    SELECT * 
    FROM TABLE 
    WHERE chp1=22 
    AND chp2=3
    Sinon peut-être que le nombre de résultats retournés est énorme, essayer de mettre des index sur la recherche des champs 1 et 2 ! (même si je ne pense pas que se soit sa !)

  3. #3
    Membre expérimenté Avatar de scheu
    Inscrit en
    Juin 2007
    Messages
    1 506
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 1 506
    Points : 1 738
    Points
    1 738
    Par défaut
    Ta requête est correcte, pas besoin de la réécrire (en plus tu ne feras qu'un seul parcours de la table contrairement au UNION)
    Si tu veux gagner en performances, essaie effectivement de mettre un index sur (chp1,chp2), mais ça ne sera utile que si le SELECT n'est censé renvoyé qu'un faible nombre de lignes comparé à la volumétrie de la table

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 920
    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 920
    Points : 51 712
    Points
    51 712
    Billets dans le blog
    6
    Par défaut
    Justement si les colonnes sont indexées, l'union ALL ira plus vite dans ce cas !

    A +

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Bonjour je vous remercie pour vos idées cependant le UNION ne marche pas.
    Dans ma requète j'ai des jointures avec 4 tables et lorsque je mets le UNION j'ai une erreur qui me dit que "le bloc d'interogation contient un nombre incorrect de colonne résultat".
    Pour ce qui est de l'indextaion je ne peux pas toucher à la base, c'est une base de production qui ne m'appartient pas, je fais juste de la sélection pour afficher des données.

    Ma requète est ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT champs dont j''ai besoin 
    FROM TABLE,TABLEINTER,SOUSTABLE,PERSONNE 
    WHERE PERSONNE.nom like 'MARTIN' 
    AND PERSONNE.id=SOUSTABLE.id 
    AND SOUSTABLE.id=TABLEINTER.id 
    AND SOUSTABLE.id=TABLE.id 
    AND TABLE.chp1=12 
    AND TABLE.chp2=0 
    OR TABLE.chp1=22 
    AND TABLE.chp2=3;
    J'ai essayé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT * 
    FROM TABLE,TABLEINTER,SOUSTABLE,PERSONNE 
    WHERE PERSONNE.nom like 'MARTIN' 
    AND PERSONNE.id=SOUSTABLE.id 
    AND SOUSTABLE.id=TABLEINTER.id 
    AND SOUSTABLE.id=TABLE.id 
    AND TABLE.chp1=12 
    AND TABLE.chp2=0 
    UNION 
    SELECT *
    FROM TABLE 
    WHERE TABLE.chp1=22 
    AND TABLE.chp2=3;
    et :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     SELECT champs dont j''ai besoin 
    FROM TABLE,TABLEINTER,SOUSTABLE,PERSONNE 
    WHERE PERSONNE.nom like 'MARTIN' 
    AND PERSONNE.id=SOUSTABLE.id 
    AND SOUSTABLE.id=TABLEINTER.id 
    AND SOUSTABLE.id=TABLE.id 
    AND TABLE.chp1=12 
    AND TABLE.chp2=0 
    UNION 
    SELECT champs dont j''ai besion 
    FROM TABLE,TABLEINTER,SOUSTABLE,PERSONNE  
    WHERE TABLE.chp1=22 
    AND TABLE.chp2=3;
    Merci pour votre aide.

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 920
    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 920
    Points : 51 712
    Points
    51 712
    Billets dans le blog
    6
    Par défaut
    Postez la requête dans son intégralité !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    champs dont j'ai besoin
    Ne nous aide vraiment pas !!!

    A +

  7. #7
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 115
    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 115
    Points : 28 493
    Points
    28 493
    Par défaut
    Normal que ta requête prenne autant de temps à s'exécuter
    En n'utilisant pas les jointures normalisées et en ne tenant pas compte de la précédence des opérateurs, tu effectues un produit cartésien entre tes quatre tables
    Sans parenthèses, ta requête s'exécute comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT champs dont j''ai besoin 
    FROM TABLE,TABLEINTER,SOUSTABLE,PERSONNE 
    WHERE    (    PERSONNE.nom LIKE 'MARTIN' 
            AND PERSONNE.id=SOUSTABLE.id 
            AND SOUSTABLE.id=TABLEINTER.id 
            AND SOUSTABLE.id=TABLE.id 
            AND TABLE.chp1=12 
              AND TABLE.chp2=0 
            )
         OR (    TABLE.chp1=22 
              AND TABLE.chp2=3
            )
     ;
    Comme ça, ça devrait déjà être plus efficace
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT champs dont j''ai besoin 
    FROM TABLE,TABLEINTER,SOUSTABLE,PERSONNE 
    WHERE PERSONNE.nom like 'MARTIN' 
    AND PERSONNE.id=SOUSTABLE.id 
    AND SOUSTABLE.id=TABLEINTER.id 
    AND SOUSTABLE.id=TABLE.id 
    AND (TABLE.chp1=12 
      AND TABLE.chp2=0 
     OR TABLE.chp1=22 
      AND TABLE.chp2=3
     );
    Et comme ça, encore mieux :
    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 champs dont j''ai besoin
    FROM    TABLE
        INNER JOIN
            SOUSTABLE
            ON SOUSTABLE.id=TABLE.id
        INNER JOIN
            TABLEINTER
            ON SOUSTABLE.id=TABLEINTER.id
        INNER JOIN
            PERSONNE
            ON PERSONNE.id=SOUSTABLE.id
    WHERE PERSONNE.nom like 'MARTIN'
        AND (   TABLE.chp1=12 AND TABLE.chp2=0
            OR  TABLE.chp1=22 AND TABLE.chp2=3
            )
    ;

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    C'est nikel j'ai opté pour le INNER JOIN, fallait juste qu'on me rappelle que ça existe!

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

Discussions similaires

  1. UPDATE sur tous les champs en même temps > saisie rapide ?
    Par sendme dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 30/01/2011, 12h52
  2. Réponses: 3
    Dernier message: 17/07/2007, 10h44
  3. Tri sur deux champs en même temps
    Par Azharis dans le forum Access
    Réponses: 8
    Dernier message: 11/01/2006, 14h10
  4. Modifier deux champs en même temps!!!
    Par Invité dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 08/09/2005, 21h31
  5. Comptez sur deux tables en même temps
    Par genova dans le forum Langage SQL
    Réponses: 12
    Dernier message: 13/09/2004, 19h58

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