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 :

Requetes MySQL complexes


Sujet :

Bases de données Delphi

  1. #1
    Membre à l'essai
    Inscrit en
    Mai 2006
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 13
    Points : 14
    Points
    14
    Par défaut Requetes MySQL complexes
    Bonjour, j'execute 2 requetes afin de comparer les données d'une table par rapport à une autre et de retourner les données différentes.
    Voici mes 2 requetes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
      requeteMySQL := 'SELECT * FROM infor WHERE ref IN (SELECT ref FROM exchange) AND ('
                    + 'entreprise NOT IN (SELECT entreprise FROM exchange) '
                    + 'OR nom NOT IN (SELECT nom FROM exchange) '
                    + 'OR prenom NOT IN (SELECT prenom FROM exchange) '
                    + 'OR adresse NOT IN (SELECT adresse FROM exchange) '
                    + 'OR ville NOT IN (SELECT ville FROM exchange) '
                    + 'OR CP NOT IN (SELECT CP FROM exchange) '
                    + 'OR pays NOT IN (SELECT pays FROM exchange) '
                    + 'OR tel_ent NOT IN (SELECT tel_ent FROM exchange) '
                    + 'OR tel_ent2 NOT IN (SELECT tel_ent2 FROM exchange) '
                    + 'OR portable NOT IN (SELECT portable FROM exchange) '
                    + 'OR fax NOT IN (SELECT fax FROM exchange))'
                    + 'ORDER BY ref';
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    requeteMySQL := 'SELECT * FROM exchange WHERE ref IN (SELECT ref FROM infor) AND ('
                    + 'entreprise NOT IN (SELECT entreprise FROM infor) '
                    + 'OR nom NOT IN (SELECT nom FROM infor) '
                    + 'OR prenom NOT IN (SELECT prenom FROM infor) '
                    + 'OR adresse NOT IN (SELECT adresse FROM infor) '
                    + 'OR ville NOT IN (SELECT ville FROM infor) '
                    + 'OR CP NOT IN (SELECT CP FROM infor) '
                    + 'OR pays NOT IN (SELECT pays FROM infor) '
                    + 'OR tel_ent NOT IN (SELECT tel_ent FROM infor) '
                    + 'OR tel_ent2 NOT IN (SELECT tel_ent2 FROM infor) '
                    + 'OR portable NOT IN (SELECT portable FROM infor) '
                    + 'OR fax NOT IN (SELECT fax FROM infor))'
                    + 'ORDER BY ref';
    Dans la majorité des cas j'obtiens bien une table dans laquelle je retrouve les champs des 2 tables différentes que je peux associer par paire à partir du champ "ref". Cependant je me retrouve avec des lignes seules... Il trouve une différence d'une table vers une autre mais pas dans l'autre sens !!

    Ce problème viens t-il de ma requete ou alors éventuellement le traitement perd des données ? Quelqu'un peut il m'aider ? Ce problème est assez embétant... surtout quand on doit traiter plus de 6000 lignes !!!
    A faire à la main c'est impensable !

  2. #2
    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
    Je ne comprend pas bien l'utilité de tes requetes (En plus des NOT IN SELECT à la chaine comme ça ), de plus je doute du résultat obtenu

    Tu veux vérifier quoi ?
    Que les personnes dans la table Infor n'existe pas dans la table Exchange ?

    Normalement Le champ Ref de tes tables donne une valeur unique ou il peut y avoir des doublons ? (ce qui ne serait pas normal, une référence doit être unique)
    Modérateur Delphi

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

  3. #3
    Membre à l'essai
    Inscrit en
    Mai 2006
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 13
    Points : 14
    Points
    14
    Par défaut
    En fait je suis censé avoir 2 tables identiques (infor et exchange) mais en réalité, il y a des différences entre ces 2 tables (due aux enregistrements dans une table mais pas dans l'autre) et ce sont ces différences que je cherche à afficher.
    Les enregistrements pouvant juste etre des updates, je suis obligé de tester champ par champ.
    Le champ ref de mes tables est un champ unique. Il est généré pas ma table infor et est copié dans ma table exchange lors de la création de l'enregistrement dans cette table. C'est de ce champ que part ma comparaison.

    La requete que je souhaite faire suit la démarche suivante :
    sélectionner un champ ref dans une table
    sélectionner le meme champ ref dans l'autre table
    comparer les cellules une a une
    si différence, retourner la ligne

    J'espere que ces explications t'éclaireront pour comprendre ce que je souhaite faire.

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

    Je ne suis pas certain d'avoir bien compris ta demande, mais tu peux essayer ceci:
    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
     
    requeteMySQL := 'SELECT i.* FROM infor AS i' +
                    'LEFT OUTER JOIN exchange AS e ' +
                    'ON i.ref = e.ref ' +
                    'WHERE ' +
                    'i.entreprise <> e.entreprise OR '+
                    'i.nom <> e.nom OR ' +
                    'i.prenom <> e.prenom OR ' +
                    'i.adresse <> e.adresse OR ' +
                    'i.ville <> e.ville OR ' +
                    'i.CP <> e.CP OR ' +
                    'i.pays <> e.pays OR ' +
                    'i.tel_ent <> e.tel_ent OR ' +
                    'i.tel_ent2 <> e.tel_ent2 OR ' +
                    'i.portable <> e.portable OR ' +
                    'i.fax <> e.fax ' +
                    'ORDER BY i.ref';
    [edit] un INNER JOIN est peut-être plus adapté ? [/edit]
    @+ Claudius

  5. #5
    Membre habitué Avatar de giltonic
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    109
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 109
    Points : 137
    Points
    137
    Par défaut
    [QUOTE=kirian]Bonjour, j'execute 2 requetes afin de comparer les données d'une table par rapport à une autre et de retourner les données différentes.
    Voici mes 2 requetes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
      requeteMySQL := 'SELECT * FROM infor WHERE ref IN (SELECT ref FROM exchange) AND ('
                    + 'entreprise NOT IN (SELECT entreprise FROM exchange) '
                    + 'OR nom NOT IN (SELECT nom FROM exchange) '
                    + 'OR prenom NOT IN (SELECT prenom FROM exchange) '
                    + 'OR adresse NOT IN (SELECT adresse FROM exchange) '
                    + 'OR ville NOT IN (SELECT ville FROM exchange) '
                    + 'OR CP NOT IN (SELECT CP FROM exchange) '
                    + 'OR pays NOT IN (SELECT pays FROM exchange) '
                    + 'OR tel_ent NOT IN (SELECT tel_ent FROM exchange) '
                    + 'OR tel_ent2 NOT IN (SELECT tel_ent2 FROM exchange) '
                    + 'OR portable NOT IN (SELECT portable FROM exchange) '
                    + 'OR fax NOT IN (SELECT fax FROM exchange))'
                    + 'ORDER BY ref';

    En faisant des requetes de la sorte, il est certain que n'importe quel base données est a genou !
    Je vous conseille de faire séquenciellement la comparaison. Ca sera plus rapide : 2 requetes, on parcours l'une et on regarde dans l'autre si c'est trouvé : certes, au final ca fait plus de requetes dans le code mais si on libère bien ca sera rapide un enregistrement sera trouvé a la fois...

    parce que des SELECT dans des SELECT c'est fait pour 1 champs voir 2 mais là, Mysql n'est pas optimisée pour faire ce genre de truc. Faut pas pousser !

    Exemple :
    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
    19
    Query1.SQL.Add('SELECT * FROM infor');
    Query1.open;
    While not(Query1.eof) do
    begin
    Query2.Close;
    Query2.Clear;
    Query2.SQL.Add('SELECT * FROM exchange WHERE entreprise=:entreprise');
    Query2.ParamByName('entreprise').Asstring:=Query1.FieldByName('entreprise').Asstring;
    Query2.open;
    If QUery2.IsEmpty then 
    begin
    // Traitement
    end
    else
    begin
    // Autre Traitement ... 
    end;
    Query1.Next;  // Que j'ai souvent tendance a oublier :D
    end;
    Salutations
    Musique : Oasis | Photos : Panoramio

Discussions similaires

  1. requete mysql complexe pour dessiner une courbe lineaire
    Par fou-jea dans le forum Requêtes
    Réponses: 1
    Dernier message: 07/09/2012, 14h50
  2. [MySQL] Requete Mysql complexe
    Par HWICE dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 24/09/2007, 17h04
  3. Requete MySql un peu complexe !
    Par walou dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 03/09/2007, 20h42
  4. Requete MySql complexe ?
    Par walou dans le forum JDBC
    Réponses: 2
    Dernier message: 03/09/2007, 14h29
  5. Problème pour écrire des requetes mysql complexes
    Par truemistress dans le forum Requêtes
    Réponses: 8
    Dernier message: 08/02/2007, 18h29

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