[Access] Comparer deux grosses tables

enigmatoile Messages postés 730 Statut Membre -  
 HelloWorld -
Bonjour,

Je souhaiterais faire une comparaison entre deux tables de meme structure, afin de savoir si dans l'une il y a des enregistrements qu'il n'ya pas dans l'autre.

Mon souci : mes tables sont ENORMES (250.000 lignes environ chacunes....).

La technique que j'utilisais jusqu'à présent est la suivante : je faisais des requetes pour chaque table où je concaténais les champs qui m'intéressaient, puis une requete de comparaison des concaténats par une formule de type

VraiFaux(EstNull[requete2]![Concaténat]);"inexistant";"existant"

En sélectionnant les "inexistant", j'obtiens les enregistrements qui sont dans le requete 1 et pas dans la requete 2

Cette technique marchait très bien jusqu'ici, car je n'en avais besoin que pour des tables de taille raisonnable...

J'ai essayé avec mes grosses tables, j'ai lancé ma requete avant de partir, à 18h ; ce matin à 9h30 elle n'était pas terminée...

Voyez vous une autre technique moins couteuse en temps?
Ou vais je devoir persuader les gens que c'est impossible?

Merci de vos conseils.

6 réponses

GauthierS Messages postés 17 Statut Membre 13
 
Je ne sais pas si ce sujet est toujours d'actualité, mais voici quelque chose à essayer:

Select table1.id, table1.champ1, table1.champ2
From table1 left join table2 on (table1.id=table2.id and table1.champ1=table2.champ1 and table1.champ2=table2.champ2)
Where table2.id Is Null

Cette méthode devrait renvoyer tous les enregistrements de la table1 qui ne sont pas trouvé dans la table2
Attention que si une valeur est Null dans les 2 tables, comme Null n'est pas égal à Null, ça va aussi renvoyer ces enregistrements.
7
afam
 
Bonjour à tous,
je suis actuellement sur un projet et je dois comparer deux tables que j'ai au préalable importées d'exel.
L'objectif est de savoir comment savoir quelles sont les données modifiées, supprimées, et mise à jour chez l'une et pas chez l'autre.
Je compte sur vous svp,merci!!
0
Voldorak
 
Merci beaucoup!! Ca a parfaitement solutionné mon problème !! :)
0
HelloWorld
 
Parfait ! merci
0
zenon Messages postés 729 Statut Membre 180
 
Je suis peut -être trop optimiste, mais si les champs étaient indexés par date, il suffirait de regarder le dernier enregistrement de la première table et de partir de celui-ci pour voir combien ont été ajoutés dans l'autre.

évidemment ça ne marche que si tu ne dois pas trouver les enregistrements déjà existants qui auraient été modifiés...

Par ailleurs, si tu inclus deux tables non liées dans une même requête, tu vas avoir des erreurs: Access va afficher pour chaque enregistrement d'une table tous les enregistrements de l'autre table
Tu pourrais essayer de créer un lien entre les deux tables (clé primaire) puis choisir un des champs pouvant avoir été modifié et exécuter ce type de requête:

SELECT Table1.ChampX
FROM Table1 INNER JOIN Table2 ON Table1.Clé = Table2.Clé
WHERE (((Len([Table1].[ChampX]))<>Len([Table2].[ChampX])));

En combinant les deux méthodes et en répétant éventuellement sur les autres champs mis à jour, ça devrait fonctionner...
3
enigmatoile Messages postés 730 Statut Membre 5
 
Y'a pas de notions de date dans mes tables donc...

Sinon oui, je crée des liens quand je fais mes requetes, ce sont les tables qui n'ont de relations directes.

Ta deuxième idée ne me semble pas applicable à mon cas : jepeux avoir ddes cas où le champ1 est égal mais le champ2 différent...

Mais bon avec ma réponse au dessus je pense avoir trouvé un résultat viable :)
0
zenon Messages postés 729 Statut Membre 180
 
Quelques renseignements complémentaires...

Quand tu dis que ta structure est identique, tu veux dire que tous les champs sont communs?

Comment fonctionnent les clés primaires?

Et les relations?
1
enigmatoile Messages postés 730 Statut Membre 5
 
Oui, tous les champs sont identiques.

Les clés sont des nuémros autos.

Pas de relations entre les tables, il s'agit de memes infos à un instant T puis T+1.

Entre temps j'ai trouvé des pistes de réflexion:
Globalement ma table prend les valuers suivantes

service1 serveur1
service 2 servuer1
service a serveur2
serviceb serveur 2


Je pensais compter le nombre de services par serveur, et comparer ces nombres entre les 2 tables.

A ce moment là seulement je chercherai les nouveaux services; et pour un serveir fixé...

Il y a une autre solution plus hard, qui consisterait à faore un haché des services pour cq serveur, mais j'aimerais bien échapper à ca...
0
zenon Messages postés 729 Statut Membre 180
 
Content pour toi si tu as la solution...

Pour l'avenir, tu n'ajouterais pas un champ DateCréation et un autre DateModification, ça t'éviterait de te casser la tête...

Bonne soirée.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Jessthedevil
 
Merci GauthiersS, tu m'as sauvé la vie. Cela fait Trois jours que je suis dessus.

Pour ceux qui buchent comme moi, ne faites pas la même erreur, ne travaillez pas sur des REQUÈTES, mais bien sur des TABLES !

Have Fun
0
Babar
 
Bonjour à tous,

Je suis nouveau sur ce forum et novice sur access / sql.

Je vous expose mon problème j'ai une base de données avec 2 tables comme suit :

Table1 Table2
Champ1 Champ1
enregistrement1 enregistrement1
enregistrement2 enregistrement2
enregistrement3 enregistrement3

Le champ1 de la Table1 contient une liste produit et le champ1 de la Table2 contient une liste aléatoire de mots-clés.

Je souhaiterai (sous Access) créé une requête de sorte qu'il me selectionne et m'affiche tous les enregistrements du champ1 (Table1) qui contiennent un mot-clé du champ1 (Table2).

Par ex :

Table1 / Champ1 contient "CremeSolaire", et la table 2 / Champ1 contient "Solaire".

Je souhaite donc que Cremesolaire qui contient "Solaire" soit selectionnée et affichée dans un rapport ou une nouvelle table.

Aidez moi s'il vous plaît, j'arrête pas d'essayer je pète un plomb.

Merci bien.
0