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

  1. #1
    Nouveau membre du Club
    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 averti
    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

    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
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  4. #4
    Nouveau membre du Club
    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é
    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
    Philippe.

  6. #6
    Nouveau membre du Club
    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.

  7. #7
    Expert confirmé
    C'est quoi cette horreur ?
    Je ne parle pas de la non utilisation des balises [ CODE ] pour mettre en forme la requête et accessible via le bouton # dans la zone d'édition !
    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 ))

    Par analogie, je pourrais traduire votre requête en langage naturel comme suit :
    Je veux les ballons qui sont rouges et qui coutent entre 20 et 25 € parmi les ballons qui sont rouges et qui coutent entre 20 et 25 €.
    Philippe.

  8. #8
    Rédacteur/Modérateur

    Citation Envoyé par chatour Voir le message

    qui serait plus élégant avec des jointures.
    je crois que vous ne comprenez pas la notion de Jointure (qui d'un manière générale se fait entre tables avec des relations
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  9. #9
    Nouveau membre du Club
    Comme quoi OR peut être aussi une horreur
    Bon, pas de quoi crier au meurtre en tapant mon texte j'ai reproduit une des conditions sans changer les valeurs.
    Voilà une nouvelle mouture qui va me valoir, à n'en pas douter, de chaudes félicitations:

    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 15 and 20)
    AND T.CODEA IN
    (SELECT T.CODEA
    FROM MATABLE T
    WHERE (T.CODEB =B3) and (T.VALEUR BETWEEN 20 and 25 ))


    ou aussi bien
    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 =B3) and (T.VALEUR BETWEEN 20 and 25 ))

  10. #10
    Expert confirmé
    Citation Envoyé par chatour Voir le message
    Bon, pas de quoi crier au meurtre en tapant mon texte j'ai reproduit une des conditions sans changer les valeurs.
    En effet, mais comment voulez vous que l'on vous aide à trouver la bonne solution si vos hypothèses sont erronées !
    Citation Envoyé par chatour Voir le message
    Voilà une nouvelle mouture qui va me valoir, à n'en pas douter, de chaudes félicitations:
    Certes pas, par contre :
    Pour en revenir à votre problème, et si tenté qu'il soit complètement posé, on peut le résoudre par une auto-jointure qui serait AMHA plus performante...
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT T1.CODEA
    FROM MATABLE T1
    INNER JOIN MATABLE T2 ON T1.CODEA = T2.CODEA
    WHERE (T1.CODEB = 'B2') AND (T1.VALEUR BETWEEN 15 and 20)
    AND   (T2.CODEB = 'B3') AND (T2.VALEUR BETWEEN 20 and 25)
    Philippe.

  11. #11
    Rédacteur/Modérateur

    Citation Envoyé par chatour Voir le message

    Voilà une nouvelle mouture qui va me valoir, à n'en pas douter, de chaudes félicitations
    certainement pas en ce qui concerne l'utilisation des balises c'est ma troisième intervention a ce sujet ! il n'est pourtant pas compliqué de sélectionnerle texte du SQL et de cliquer sur le bouton #

    je reste toujours également baba en voyant une clause
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    (T.CODEB =B2)

    alors que comme indiqué au début
    Citation Envoyé par chatour
    J'ai une table avec trois champs, CODEA, CODEB, VALEUR avec uniquement des entiers
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  12. #12
    Nouveau membre du Club
    Pour terminer
    Bonjour à tous

    L’accueil a été rude !
    Avec un peu de recul, je souhaite ajouter quelques mots pour défendre mon point de vue en espérant que vous ne m’en voudrez pas.
    A la lecture de vos réponses, j’ai pensé que je n’avais que deux attitudes possibles, disparaître ou trouver la solution que j’avais recherchée sans succès avant mon appel à l’aide.
    Je persiste à penser que ma question était clairement posée : il n’y a pas d’ambiguïté quant au fait que les deux conditions doivent être réalisées et il faut regarder attentivement mes données pour voir ou est le problème.
    Philippe donne la réponse finale avec les jointures, ce qui montre que sur le fond je n’ai pas commis d’erreur, la solution s’écrit bien avec des requêtes imbriquées en utilisant ou pas des jointures.
    J’ai relu les règles du forum, les balises sont imposées, j’ai donc eu tort de ne pas les utiliser et d’irriter ainsi SergioMaster, qu’il veuille bien me le pardonner.
    Je ne crois pas pour autant qu’il n’y ait pas de façon plus lisible de rédiger.
    Finalement n’avez-vous pas dégainé un peu vite ?

    Je vous remercie de m’avoir permis d’avancer.

    Amicalement.

  13. #13
    Expert confirmé
    Bonjour,
    Citation Envoyé par chatour Voir le message
    L’accueil a été rude !
    Tout au plus à l'aulne de votre arrivée...
    Citation Envoyé par chatour Voir le message
    Avec un peu de recul, je souhaite ajouter quelques mots pour défendre mon point de vue en espérant que vous ne m’en voudrez pas.
    Du tout.
    Citation Envoyé par chatour Voir le message
    A la lecture de vos réponses, j’ai pensé que je n’avais que deux attitudes possibles, disparaître ou trouver la solution que j’avais recherchée sans succès avant mon appel à l’aide.
    Vous en avez oublié une 3°, ou plutôt la 1° qui était d'apporter les compléments d'informations demandés et de veiller à une mise en forme minimale (balise [ CODE ]).
    Citation Envoyé par chatour Voir le message
    Je persiste à penser que ma question était clairement posée : il n’y a pas d’ambiguïté quant au fait que les deux conditions doivent être réalisées et il faut regarder attentivement mes données pour voir ou est le problème.
    Je maintiens le contraire !
    Plutôt que de préciser votre demande voire donner un jeu d'essai, vous avez balancé des requêtes SQL de surcroit erronées...
    Citation Envoyé par chatour Voir le message
    Philippe donne la réponse finale avec les jointures, ce qui montre que sur le fond je n’ai pas commis d’erreur, la solution s’écrit bien avec des requêtes imbriquées en utilisant ou pas des jointures.
    Il a fallu le 4° message pour comprendre ce que vous vouliez, et encore en analysant la requête...
    Citation Envoyé par chatour Voir le message
    J’ai relu les règles du forum, les balises sont imposées, j’ai donc eu tort de ne pas les utiliser et d’irriter ainsi SergioMaster, qu’il veuille bien me le pardonner.
    Je ne crois pas pour autant qu’il n’y ait pas de façon plus lisible de rédiger.
    Les balise [ CODE ] permettent de colorer syntaxiquement et automatiquement votre requête SQL, quoi de plus lisible ?
    Citation Envoyé par chatour Voir le message
    Finalement n’avez-vous pas dégainé un peu vite ?
    Je vous retourne la question...
    Citation Envoyé par chatour Voir le message
    Je vous remercie de m’avoir permis d’avancer.

    Amicalement.
    De rien.
    Cordialement.
    Philippe.