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

Bases de données Delphi Discussion :

Requête SQL sur la clause in et not in


Sujet :

Bases de données Delphi

  1. #1
    Membre actif
    Inscrit en
    Juin 2008
    Messages
    324
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 324
    Points : 217
    Points
    217
    Par défaut Requête SQL sur la clause in et not in
    bon soir c'est ma premiere participattion
    j' ai 02 table sous access :
    1-epost : poste :integer ,ste:integer ,date:date.
    2-propost : mois;string ,ste:integer ,post:integer

    je veut extraire les poste de la table epost qui figure entre 01/01/2008 et 30/01/2008 et qui ontle champ ste= 861

    et qui figure dans la table propost dans le mois =janvier et ste=861.

    la premiere requete select poste from epost
    where date between :a and :b
    and ste :c

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    adoquery1.parameters.parambyname('a').value:= datetimepicker1.date 
    adoquery1.parameters.parambyname('b').value:= datetimepicker2.date
    adoquery1.parameters.parambyname('c').value:= edit1.text;
    ===== le resultat est ======
    les postes resultant : 87
    12

    deuxieme requete: select post from propost
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    where mois=:a and ste=:b
    adoquery1.parameters.parambyname('a).value:= edit2.text; 
    adoquery1.parameters.parambyname('b).value:= edit1.text;
    ==== le resultat =====
    les postes : 87
    :33
    ================ma question =========
    comment je peut avec une requete sql extraire les postes dans
    propost(2 table) est ne sont pas dans epost(1 table)
    et j'àbtien le resultat suivant:
    33
    en realite j'ai essaye avec ce code est as de resultat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    t4.Close; // t4 c'est un adoquery3
    t4.sql.Clear;
    t4.sql.Add('select post from propost');
    t4.sql.Add('where post not in (select poste');
    t4.sql.Add('from epost where date between :a and :b ');
    t4.SQL.Add('and ste =:e)');
    t4.sql.add('mois =:c and ste=:e');
     
    t4.parameters.ParamByName('a').Value:=datetostr(d1.Date);
    t4.parameters.ParamByName('b').Value:=datetostr(d2.Date);
    t4.parameters.ParamByName('c').Value:= combobox3.Text;
    t4.Parameters.ParamByName('e').Value:= combobox1.Text;
    t4.open;

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    Bonjour et bienvenue sur les forums de Développez.com

    Pour ma part je verrais plutôt la requête SQL comme ceci :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT poste
    FROM epost
    WHERE date between :dateDebut and :dateFin
    AND ste = :codeSte
    AND EXISTS(
      SELECT post
      FROM propost
      WHERE propost.post = epost.poste
      AND ste = :codeSte
      AND mois = :nomMois
    )
    La FAQ - les Tutoriels - Le guide du développeur Delphi devant un problème

    Pas de sollicitations techniques par MP -

  3. #3
    Membre actif
    Inscrit en
    Juin 2008
    Messages
    324
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 324
    Points : 217
    Points
    217
    Par défaut remerciment
    merci beaucoup pour votre réponse ami je vai essayer ,et je vous repond.
    merci autre fois pour votre colaboration

  4. #4
    Membre actif
    Inscrit en
    Juin 2008
    Messages
    324
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 324
    Points : 217
    Points
    217
    Par défaut
    salut mon camarade j'ai essayé votre code mais il ya un message d'erreur qui apparait " type donné incomptible dans l'expression de critére " et voici ce que j'ai fai

    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
    17
    18
    begin
    with a do
    begin
    close;
    sql.Clear;
    sql.Add(' SELECT poste FROM epost');
    sql.Add(' WHERE date BETWEEN :a AND :b ');
    sql.Add(' AND ste = :codeSte ');
    sql.Add(' AND EXISTS( SELECT post FROM propost ');
    sql.Add(' WHERE propost.post = epost.poste AND  ');
    sql.Add(' ste = :e AND mois = :c)');
    parameters.ParamByName('a').Value:=datetostr(datetimepicker1.Date) ;
    parameters.ParamByName('b').Value:=datetostr(datetimepicker2.Date) ;
    parameters.parambyname('e').Value:=combobox1.text;
    parameters.parambyname('c').Value:=combobox3.text;
    open;
    end;
    end;
    voila mes tables

    ce fichier rar contient des images des tables access et ses structure

  5. #5
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Salut

    Essaye comme ceci, sans passer par un DateToStr:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    parameters.ParamByName('a').Value := datetimepicker1.Date;
    parameters.ParamByName('b').Value := datetimepicker2.Date;
    @+ Claudius

  6. #6
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Pense au Balise CODE (Touche #)

    Tu n'aurais pas oublié la paramètre codeSte

    Sinon, une formulation en jointure ça serait pas plus simple ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT poste
    FROM epost
    INNER JOIN propost ON propost.post = epost.poste and propost.ste = epost.ste
    WHERE epost.date BETWEEN :dateDebut AND :dateFin
    AND epost.ste = :codeSte
    AND propost.mois = :nomMois
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  7. #7
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    Le problème initial est que tu ne renseigne pas le paramètre :codeSte à mon avis

    Sinon effectivement c'est bien mieux avec une jointure mais bon sans indications sur les clés primaires/étrangères c'est pas évident de faire sans boulettes
    La FAQ - les Tutoriels - Le guide du développeur Delphi devant un problème

    Pas de sollicitations techniques par MP -

  8. #8
    Membre actif
    Inscrit en
    Juin 2008
    Messages
    324
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 324
    Points : 217
    Points
    217
    Par défaut disussion
    merci beaucoup pour votre aide .
    pour le codeste c'est juste une erreur de frape.

    je vai essayer surtout la nouvelle truc de inerjunt.

    juste un seci ,quelle est la difference entre la clause sql in et la clause exist.
    enfin merci beacoup.

  9. #9
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    La clause IN est inclusive, tu recherche une valeur IN (dans) un ensemble.

    La clause EXISTS est simplement booléenne, si la sous-requête du Exists retourne au moins une ligne alors la condition sera considérée comme True, si la sous-requête ne retourne aucune ligne alors la condition est considérée comme False.
    La FAQ - les Tutoriels - Le guide du développeur Delphi devant un problème

    Pas de sollicitations techniques par MP -

  10. #10
    Membre actif
    Inscrit en
    Juin 2008
    Messages
    324
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 324
    Points : 217
    Points
    217
    Par défaut félicitation

    enfin la requette marche j'ai itulisé la solution de shailtrool,
    merci beaucoup shailtrool et cl@udius
    le code est le suivant:

    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
    17
    18
    procedure TForm1.BitBtn2Click(Sender: TObject);
    begin
     with adoquery1 do
     begin
    close;
    sql.Clear;
    sql.Add('SELECT poste  FROM epost  ');
    sql.Add('INNER JOIN propost ON propost.post = epost.poste and propost.ste = epost.ste');
    sql.Add('WHERE epost.date BETWEEN :dateDebut AND :dateFin');
    sql.Add('AND epost.ste = :codeSte');
    sql.add('AND propost.mois = :nomMois');
    parameters.ParamByName('nommois').Value:=combobox3.Text;
    parameters.parambyname('codeste').value:=combobox1.text;
    parameters.parambyname('datedebut').value:= datetostr(d.date);
    parameters.parambyname('datefin').value:= datetostr(f.date);
    open;
     end;
    end;
    merci beaucoup

  11. #11
    Membre actif
    Inscrit en
    Juin 2008
    Messages
    324
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 324
    Points : 217
    Points
    217
    Par défaut juste une question
    pourquoi le code suivant ne marche pas malgrés il me semble correcte ,est il me sort le message suivant "type de donne incompatible dans l'expression de critére "
    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
    17
    18
    begin
    with a do
    begin
    close;
    sql.Clear;
    sql.Add(' SELECT poste FROM epost');
    sql.Add(' WHERE date BETWEEN :a AND :b ');
    sql.Add(' AND ste = :e ');
    sql.Add(' AND EXISTS( SELECT post FROM propost ');
    sql.Add(' WHERE propost.post = epost.poste AND  ');
    sql.Add(' ste = :e AND mois = :c)');
    parameters.ParamByName('a').Value:=datetostr(datetimepicker1.Date) ;
    parameters.ParamByName('b').Value:=datetostr(datetimepicker2.Date) ;
    parameters.parambyname('e').Value:=combobox1.text;
    parameters.parambyname('c').Value:=combobox3.text;
    open;
    end;
    end;
    ou est la faut et merci beacoup

  12. #12
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 043
    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 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut
    réponse de Cl@uduis hier à 14h49

    pour le code , utilise les Balises (le # juste en haut) merci
    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

  13. #13
    Membre actif
    Inscrit en
    Juin 2008
    Messages
    324
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 324
    Points : 217
    Points
    217
    Par défaut je repose mon question au secour

    bon jour champions
    pour quoi il me sort le message :type de donné incompatible dans l'expression de critére.
    il me semble correcte.

    ne me laissez pas avec mes soucis.
    merci d'avance

    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
    17
    18
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    with adoquery do
    begin
    close;
    sql.Clear;
    sql.Add('select poste from epost ');
    sql.Add('WHERE date BETWEEN :dateDebut AND :dateFin   ');
    sql.add('AND ste = :codeSte AND EXISTS(  SELECT post  FROM propost   ');
    sql.Add(' WHERE propost.post = epost.poste AND ste = :codeSte');
    sql.Add('AND mois = :nomMois)');
    parameters.ParamByName('nommois').Value:=combobox1.Text;
    parameters.parambyname('codeste').value:=combobox2.text;
    parameters.parambyname('datedebut').value:= datetostr(d.date);
    parameters.parambyname('datefin').value:= datetostr(f.date);
    open;
    end;
    end;

  14. #14
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 043
    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 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut
    l'erreur est toujours la même , tu persistes à mettre une date formatée en chaine ,par l'instruction datetostr tu obtient donc une chaine sous le format (je suppose) jj/mm/aaaa toutes les base de données ne lise pas focement sous le même format (ie pour Fib ce serait mm/jj/aaaa ou jj.mm.aaaa pour d'autres cela peut être aaaa.mm.jj etc....) c'est pour cela qu'en utilisant des paramètres pour passer des dates à un SQL on s'affranchit des contraintes de format . D'où la sugestion de Cl@udius (rendons à César .....)
    Citation Envoyé par Cl@udius
    Essaye comme ceci, sans passer par un DateToStr:

    [CODE
    parameters.ParamByName('a').Value := datetimepicker1.Date;
    parameters.ParamByName('b').Value := datetimepicker2.Date;
    [/CODE]
    ou encore pour mettre les points sur les i
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    parameters.ParamByName('a').asDateTime := datetimepicker1.Date;
    parameters.ParamByName('b').asDateTime := datetimepicker2.Date;
    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

  15. #15
    Membre actif
    Inscrit en
    Juin 2008
    Messages
    324
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 324
    Points : 217
    Points
    217
    Par défaut proprieté asdatetime
    merci pour la réponse.
    la proprieté asdatetime n'existe pas avec adoquery.
    il existe evec query

Discussions similaires

  1. Réponses: 3
    Dernier message: 11/01/2006, 18h35
  2. requêtes sql sur plusieurs tables
    Par zahiton dans le forum Langage SQL
    Réponses: 4
    Dernier message: 25/11/2005, 10h59
  3. [SQL] requêtes SQL sur plusieurs tables
    Par zahiton dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 24/11/2005, 16h32
  4. A propos d'une requête SQL sur plusieurs tables...
    Par ylebihan dans le forum Langage SQL
    Réponses: 2
    Dernier message: 14/09/2003, 16h26

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