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 :

Utiliser Not In avec une clé composée


Sujet :

Bases de données Delphi

  1. #1
    Membre du Club Avatar de smail21
    Profil pro
    Inscrit en
    Février 2005
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations forums :
    Inscription : Février 2005
    Messages : 152
    Points : 61
    Points
    61
    Par défaut Utiliser Not In avec une clé composée
    Salam
    j'ai un problème avec une requête SQL sous Delphi5.
    voilà j'ai deux tables E1 et E2, je dois chercher dans E2 tous les enregistrements qui n'existent pas dans E1.
    Sachant que les deux tables ont la même structure et que leur clé est composée de 4 champs: CodeDistr,CodeStruc,CodeCFrai,CodEquip

    j'ai utilisé la code suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
       charge.SQL.Add('Select * from ' + QuotedStr(open1.FileName)+' as E1');
       charge.SQL.Add('WHERE  E1.CodDistr NOT IN ');
       charge.SQL.Add('(SELECT CodDistr FROM ":Consolid:Equipement.DB" E2 )');
     
      charge.SQL.Add('And  E1.CodStruc NOT IN ');
       charge.SQL.Add('(SELECT CodStruc FROM ":Consolid:Equipement.DB" E2 )');
     
      charge.SQL.Add('and  CodeCFrai NOT IN ');
       charge.SQL.Add('(SELECT CodeCFrai FROM ":Consolid:Equipement.DB" E2 )');
     
       charge.SQL.Add('and  CodEquip NOT IN ');
       charge.SQL.Add('(SELECT CodEquip FROM ":Consolid:Equipement.DB" E2 )');

    le résultats de la requête est de 0 enregistrements, comme si elle comparait par un seul champ.

    n y a-t-il pas un moyen d'écrire cette requete de la façon suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     charge.SQL.Add('Select * from ' + QuotedStr(open1.FileName)+' as E1');
       charge.SQL.Add('WHERE  E1.CodDistr,E1.CodStruc,E1.CodeCFrai,E1.CodEquip NOT IN ');
       charge.SQL.Add('(SELECT CodDistr,CodStruc,CodeCFrai,CodEquip FROM ":Consolid:Equipement.DB" E2 )');

    cette dernière façon ne marche pas, il m'affiche une erreur où il n'accepte pas la virgule.

    Que dois-je faire?

    merci

  2. #2
    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

    Citation Envoyé par smail21 Voir le message
    voilà j'ai deux tables E1 et E2, je dois chercher dans E2 tous les enregistrements qui n'existent pas dans E1.
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
       charge.SQL.Add('Select * from ' + QuotedStr(open1.FileName)+' as E1');
       -- ...

    Là en sélectionnant les données de E1, tu te dirige vers le résultat inverse.

    Personnellement je ferais comme ceci, requête classique de non concordance:
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
      select E2.* 
      from
        E2 left outer join E1
        on E2.PK1 = E1.PK1 and E2.PK2 = E1.PK2 -- and ...
      where 
        E1.PK1 is NULL;

    @+ Claudius

  3. #3
    Membre du Club Avatar de smail21
    Profil pro
    Inscrit en
    Février 2005
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations forums :
    Inscription : Février 2005
    Messages : 152
    Points : 61
    Points
    61
    Par défaut
    salut Claudius

    merci pour ta réponse
    j'ai executé cette requette, mais ça ne donne rien
    car ça me ramène ce que j'ai dans la première et pas dans la seconde, mais ça ne me permet pas de copier le contenu de la table E2, qui est dynamique(change de chemin) alors que la E1 a un repertoire fixe avec son alias!

    exemple:: si E1 est vide, il la requette ne rapporte aucun résultat

  4. #4
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Normalement comme ci-dessous cela devrait fonctionner

    Code Delphi : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    With Charge do
    begin
      SQL.Add('Select E2.* from ' + QuotedStr(open1.FileName)+' as E1');
      SQL.Add('Right Join ":Consolid:Equipement.DB" E2');
      SQL.Add('On E1.CodDistr = E2.CodDistr and E1.CodStruc = E2.CodStruc and');
      SQL.Add('E1.CodeCFrai = E2.CodeCFrai and E1.CodEquip =E2.CodEquip')
      SQL.Add('Having E1.CodDistr is NULL');
    end;

    J'ai juste un doute sur :Consolid:Equipement, je rappelle que : + Texte est considéré comme un paramètre dans la requete avec delphi.

    Sinon contrairement à Cl@udius je préfère l'utilisation du having au where
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  5. #5
    Membre du Club Avatar de smail21
    Profil pro
    Inscrit en
    Février 2005
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations forums :
    Inscription : Février 2005
    Messages : 152
    Points : 61
    Points
    61
    Par défaut
    Salut Rayek
    merci pour la réponse
    j'ai essayé ton code et il m'affiche une erreur Fonctionnalité non supporté

    que peut-être cette erreur?

  6. #6
    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
    Citation Envoyé par Rayek Voir le message
    Sinon contrairement à Cl@udius je préfère l'utilisation du having au where
    Ca passe ça ? En dehors d'une fonction d'agrégation ou d'une clause group by, j'en doute.
    Enfin cela dépend peut-être du SGBD, quoique...

    @+ Claudius

  7. #7
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Citation Envoyé par Cl@udius Voir le message
    Salut


    Ca passe ça ? En dehors d'une fonction d'agrégation ou d'une clause group by, j'en doute.
    Enfin cela dépend peut-être du SGBD, quoique...

    @+ Claudius
    Avec MySQL/Access ca fonctionne (sauf que j'ai oublié un truc dans la requete) avec Paradox, je ne sais pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    With Charge do
    begin
      SQL.Add('Select E1.CodDistr as ECheck,E2.* from ' + QuotedStr(open1.FileName)+' as E1');
      SQL.Add('Right Join ":Consolid:Equipement.DB" E2');
      SQL.Add('On E1.CodDistr = E2.CodDistr and E1.CodStruc = E2.CodStruc and');
      SQL.Add('E1.CodeCFrai = E2.CodeCFrai and E1.CodEquip =E2.CodEquip')
      SQL.Add('Having ECheck is NULL');
    end;
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  8. #8
    Membre du Club Avatar de smail21
    Profil pro
    Inscrit en
    Février 2005
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations forums :
    Inscription : Février 2005
    Messages : 152
    Points : 61
    Points
    61
    Par défaut
    Citation Envoyé par Rayek Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    With Charge do
    begin
      SQL.Add('Select E1.CodDistr as ECheck,E2.* from ' + QuotedStr(open1.FileName)+' as E1');
      SQL.Add('Right Join ":Consolid:Equipement.DB" E2');
      SQL.Add('On E1.CodDistr = E2.CodDistr and E1.CodStruc = E2.CodStruc and');
      SQL.Add('E1.CodeCFrai = E2.CodeCFrai and E1.CodEquip =E2.CodEquip')
      SQL.Add('Having ECheck is NULL');
    end;
    ça ne marche pas: erreur: 'Paramètre incorrect'

  9. #9
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Citation Envoyé par smail21 Voir le message
    ça ne marche pas: erreur: 'Paramètre incorrect'
    Tu peux montrer ton code jusqu'au Open de la requete ?
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  10. #10
    Membre du Club Avatar de smail21
    Profil pro
    Inscrit en
    Février 2005
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations forums :
    Inscription : Février 2005
    Messages : 152
    Points : 61
    Points
    61
    Par défaut
    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
    charge.Close;
       charge.SQL.Clear;
     With Charge do
    begin
      SQL.Add('Select E1.CodDistr as ECheck,E2.* from ' + QuotedStr(open1.FileName)+' as E1');
      SQL.Add('Right Join ":Consolid:Equipement.DB" E2');
      SQL.Add('On E1.CodDistr = E2.CodDistr and E1.CodStruc = E2.CodStruc and');
      SQL.Add('E1.CodeCFrai = E2.CodeCFrai and E1.CodEquip =E2.CodEquip');
      SQL.Add('Having ECheck is NULL');
    end;
     
      charge.open; 
      showmessage('Nb Copiés :'+inttostr(charge.recordcount));
       batch.execute;
       charge.close;

  11. #11
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Comme je te l'ai dit plus haut

    Citation Envoyé par Rayek Voir le message
    J'ai juste un doute sur :Consolid:Equipement, je rappelle que : + Texte est considéré comme un paramètre dans la requete avec delphi.
    donc il n'est normal que tu es ce message d'erreur. il te faut mettre un vrai lien pour ta table. (ou renseigner les paramètres)
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

Discussions similaires

  1. Utilisation de fichiers avec une structure
    Par showdown dans le forum C
    Réponses: 16
    Dernier message: 07/12/2006, 18h30
  2. [JTABLE] Peut-on utiliser des autoFilters avec une JTable
    Par Nico+10) dans le forum Composants
    Réponses: 3
    Dernier message: 18/09/2006, 19h53
  3. Réponses: 1
    Dernier message: 04/05/2006, 10h45
  4. [XSL] utilisation du mode avec une variable
    Par luta dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 20/04/2006, 10h12
  5. Utiliser "window.status" avec une fenêtre modale
    Par Giill dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 28/11/2005, 14h23

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