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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Juin 2008
    Messages
    324
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 324
    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 Expert

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

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    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
    )

  3. #3
    Membre éclairé
    Inscrit en
    Juin 2008
    Messages
    324
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 324
    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 éclairé
    Inscrit en
    Juin 2008
    Messages
    324
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 324
    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 confirmé
    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 : 62
    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
    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
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 089
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 089
    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 Expert

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

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    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

  8. #8
    Membre éclairé
    Inscrit en
    Juin 2008
    Messages
    324
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 324
    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.

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