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

SQL Firebird Discussion :

Aide pour requête table unique


Sujet :

SQL Firebird

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 45
    Par défaut Aide pour requête table unique
    Bonjour à tous

    J'ai une table avec trois champs, CODEA, CODEB, VALEUR avec uniquement des entiers
    Pour chacune des 10 valeurs de CODEA de A1 à A10, j'ai cinq valeurs de CODEB de B1 à B5
    A1 B1 V1
    A1 B2 V2
    A1 B3 --
    A1 B4
    A1 B5
    A2 B1
    A2 B2
    A2 B3
    A2 B4
    A2 B5
    ---
    A10 B1
    A10 B2
    A10 B3
    A10 B4
    A10 B5 V50
    Avec la requête :
    Code Delphi ? : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
          Clear;
          add ('SELECT T.CODEA');
          add('FROM MATABLE T');
          add ('WHERE (T.CODEB =B1) and (T.VALEUR BETWEEN 15 and 20 )');
          open;
    J'obtiens les valeurs de CODEA pour lesquelles B2 a une valeur comprise entre 15 et 20.

    Comment puis-je imposer une condition supplémentaire sur une autre valeur de CODEB?
    par exemple (T.CODEB =B2) and (T.VALEUR BETWEEN 20 and 25 )

    Merci pour votre réponse.

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    261
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 261
    Par défaut
    Bonjour

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    WHERE ((T.CODEB =B1) and (T.VALEUR BETWEEN 15 and 20 ))
      or  ((T.CODEB =B2) and (T.VALEUR BETWEEN 20 and 25 ))
    devrait accepter les enregistrements satisfaisants aux 2 conditions.

    André

  3. #3
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 596
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 596
    Billets dans le blog
    65
    Par défaut
    Bonjour ,

    après mes corrections sur ton post (utilisation des balises pour amélioré la lecture) , j'aurais préféré une structure de table plutôt qu'une liste abstraite de datas non conforme
    Citation Envoyé par chatour
    trois champs, CODEA, CODEB, VALEUR avec uniquement des entiers
    par exemple , ceci aurait suffi je pense
    TABLE MATABLE(
    CODEA INTEGER,
    CODEB INTEGER,
    VALEUR INTEGER)

    il est bizarre de lire un code qui à mon avis est faux (B1 n'est pas un entier) , et non "SQL"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT T.CODEA
    FROM MATABLE T
    WHERE (T.CODEB =1) and (T.VALEUR BETWEEN 15 and 20 )
    pour ce qui est du reste , je pense que alanglet à répondu

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 45
    Par défaut OR ne convient pas
    Les deux conditions doivent être satisfaites ,pas l'une OU l'autre, donc OR ne convient pas .
    Je crois qu'il faut une requête imbriquée.

  5. #5
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 786
    Par défaut
    Bonjour,
    A ce qu'a précisé @SergioMaster (Structure de la table), je rajoute qu'un jeu d'essai avec le résultat attendu peut aussi être utile et lever des ambiguïtés dans les propos formulant la demande.
    Citation Envoyé par chatour Voir le message
    Les deux conditions doivent être satisfaites ,pas l'une OU l'autre, donc OR ne convient pas .
    Je crois qu'il faut une requête imbriquée.
    Le OR qui n'est pas un OU EXCLUSIF couvre le fait que les 2 conditions sont satisfaites mais va au delà. cf la table de vérité ci dessous :
    C1 ou C2 => Résultat
    FAUX ou FAUX => FAUX
    FAUX ou FAUX => VRAI
    VRAI ou FAUX => VRAI
    VRAI ou VRAI => VRAI

    Si les 2 conditions doivent être satisfaites simultanément, alors on a :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    WHERE ((T.CODEB = 1) AND (T.VALEUR BETWEEN 15 AND 20 ))
      AND  ((T.CODEB = 2) AND (T.VALEUR BETWEEN 20 AND 25 ))
    Mais on se rend bien compte que cette clause ne renverra jamais VRAI (CODEB ne peut être égal à 1 et à 2 simultanément)

    En reprenant la demande initiale :
    Citation Envoyé par chatour Voir le message
    Avec la requête :
    Code delphi : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
          Clear;
          add ('SELECT T.CODEA');
          add('FROM MATABLE T');
          add ('WHERE (T.CODEB =B1) and (T.VALEUR BETWEEN 15 and 20 )');
          open;
    J'obtiens les valeurs de CODEA pour lesquelles B2 a une valeur comprise entre 15 et 20.
    Il serait plus judicieux de dire : J'obtiens les valeurs de CODEA pour lesquelles CODEB vaut B1 et VALEUR vaut entre 15 et 20.
    Citation Envoyé par chatour Voir le message
    Comment puis-je imposer une condition supplémentaire sur une autre valeur de CODEB?
    par exemple (T.CODEB =B2) and (T.VALEUR BETWEEN 20 and 25 )
    Si j'ai bien compris, vous cherchez les valeurs de CODEA pour lesquelles CODEB vaut B1 ou B2 et VALEUR vaut entre 15 et 20. La proposition de @alanglet est bonne. On peut à la limite la simplifier comme suit :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE (T.CODEB = B1 OR T.CODEB = B2) AND T.VALEUR BETWEEN 15 AND 20

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 45
    Par défaut Résolu
    J'ai trouvé:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT T.CODEA
    FROM MATABLE T
    WHERE (T.CODEB =B2) and (T.VALEUR BETWEEN 20 and 25 )
    AND T.CODEA IN
    (SELECT T.CODEA
    FROM MATABLE T
    WHERE (T.CODEB =B2) and (T.VALEUR BETWEEN 20 and 25 ))
    qui serait plus élégant avec des jointures.

    Maintenant je vais lire vos réponses.

Discussions similaires

  1. Besoin d'aide pour requête sur grosse table
    Par Fabouney dans le forum Langage SQL
    Réponses: 3
    Dernier message: 25/01/2006, 09h01
  2. [SQL] Aide pour requête
    Par portu dans le forum Access
    Réponses: 8
    Dernier message: 23/09/2005, 13h05
  3. Aide pour requête de Tri assez spécial (Oracle)
    Par Chips dans le forum Langage SQL
    Réponses: 2
    Dernier message: 29/04/2005, 10h56
  4. [sqlbaseserver]demande de conseils/aides pour requêtes
    Par GéniuS77 dans le forum Langage SQL
    Réponses: 14
    Dernier message: 18/03/2004, 17h27
  5. Aide pour Requête
    Par Guiche dans le forum Langage SQL
    Réponses: 3
    Dernier message: 13/11/2003, 20h18

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