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

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 45
    Points : 27
    Points
    27
    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 confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    246
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 246
    Points : 535
    Points
    535
    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 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 048
    Points : 40 965
    Points
    40 965
    Billets dans le blog
    62
    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
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

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

    Informations forums :
    Inscription : Mars 2008
    Messages : 45
    Points : 27
    Points
    27
    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 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    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 784
    Points : 5 915
    Points
    5 915
    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
    Philippe.

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

    Informations forums :
    Inscription : Mars 2008
    Messages : 45
    Points : 27
    Points
    27
    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.

  7. #7
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    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 784
    Points : 5 915
    Points
    5 915
    Par défaut
    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

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 048
    Points : 40 965
    Points
    40 965
    Billets dans le blog
    62
    Par défaut
    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
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 45
    Points : 27
    Points
    27
    Par défaut 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é
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    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 784
    Points : 5 915
    Points
    5 915
    Par défaut
    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

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 048
    Points : 40 965
    Points
    40 965
    Billets dans le blog
    62
    Par défaut
    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
    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
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 45
    Points : 27
    Points
    27
    Par défaut 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é
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    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 784
    Points : 5 915
    Points
    5 915
    Par défaut
    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.

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