2010-11-19 25 views
0

Dans Microsoft Access, j'ai une requête uniSelectedContacts et une table possibles.Analyser à la volée lors de l'exécution d'une requête dans MS Access

Disons que dans ce je possibles:

Smith,John 
Dough,John B 
Ward,Jane Karon 
Eggert,Samantha R 

Dans uniSelectedContacts je ceci:

Smith,John A 1552 1st Ave 
Dough,John 1111 2st Ave 
Ward,Jane K 2222 3st Ave 
Eggert,Samantha Rachel 3333 1st Ave 

Je veux trouver où prénom et le nom sont identifiables. Cependant, en raison de la variation de l'initiale du milieu, s'il n'y a pas d'initiale du milieu dans les possibles, je veux prendre en compte toutes les instances du nom et du prénom de uniSelectedContacts en utilisant INNER JOIN. Si les possibles ont une initiale (prénom), indépendamment de son initiale ou de son nom, je veux prendre en compte les enregistrements où le nom et le prénom de uniSelectedContacts et de possibles sont identiques et où la première lettre du milieu initial (nom) de uniSelectedContacts correspond à la première lettre de l'initiale du milieu (nom) des possibles. Ainsi, dans l'exemple ci-dessus, il doit être retourné:

Smith,John 1552 1st Ave 
Dough,John B 1111 2st Ave 
Ward,Jane Karon 2222 3st Ave 
Eggert,Samantha R 3333 1st Ave 

La requête ci-dessous est rapide et je veux conserver la vitesse, mais il sautera tous les enregistrements ci-dessus (en raison des différences initiales (prénom) :

SELECT possibles.fullname, 
     uniSelectedContacts.addresses, 
     uniSelectedContacts.cities, 
     uniSelectedContacts.us_states_and_canada, 
     uniSelectedContacts.zip_codes INTO PrepareForDuplicateCheck 
    FROM uniSelectedContacts INNER JOIN possibles ON uniSelectedContacts.TheName = possibles.fullname; 

pour tenter de répondre à la question ci-dessus, j'ai ceci:.

SELECT possibles.fullname, 
     uniSelectedContacts.addresses, 
     uniSelectedContacts.cities, 
     uniSelectedContacts.us_states_and_canada, 
     uniSelectedContacts.zip_codes, 
     possibles.[firstname] AS Expr1, 
     possibles.[lastname] AS Expr2 INTO PrepareForDuplicateCheck 
    FROM uniSelectedContacts INNER JOIN possibles ON uniSelectedContacts.TheName = possibles.fullname 
    WHERE (((possibles.firstname)=Left([fullname],InStr([fullname],",")-1)) 
    AND ((possibles.lastname)=Mid([fullname],InStrRev([fullname],",")+1))); 

étiquette ci-dessus « Entrée Paramètre Valeur possibles.firstname » message, mais je ne suis pas non plus Je suis sûr que la logique sous-jacente de la requête produira les résultats que j'attends.

Merci pour la réponse.

Répondre

0

Il est un peu difficile de dire les champs (colonnes) à partir des échantillons affichés, mais je suppose que les deux tables ont un nom complet au format nom de famille. Je ne suggère pas que ce sera rapide, mais essayez-le.

SELECT p.aname, 
     u.addresses 
     u.addresses, 
     u.cities, 
     u.us_states_and_canada, 
     u.zip_codes 
INTO PrepareForDuplicateCheck 
FROM (
     SELECT 
     Left([thename],IIf(InStrRev([thename]," ")>0, 
      InStrRev([thename]," ")-1,Len([thename]))) As AName, 
     addresses, 
     cities, 
     us_states_and_canada, 
     zip_codes 
     FROM uniSelectedContacts) u 
INNER JOIN (
     SELECT 
     Left([fullname],IIf(InStrRev([fullname]," ")>0, 
      InStrRev([fullname]," ")-1,Len([fullname]))) As AName 
     FROM possibles) AS p 
ON u.AName = p.AName; 

Une autre possibilité:

SELECT p.aname, 
     u.addresses 
INTO PrepareForDuplicateCheck 
FROM (
     SELECT 
     Left([fullname],IIf(InStrRev([fullname]," ")>0, 
      InStrRev([fullname]," ")-1,Len([fullname]))) As AName 
     FROM possibles) p , 
      uniSelectedContacts u 
WHERE u.TheName Like p.AName & "*" 
+0

Merci pour la réponse. Après 40 minutes, j'ai dû forcer la fermeture de l'application car cette requête était toujours en cours d'exécution. Est-il possible de faire une condition qui ne prendra pas plus de 5 minutes? Par exemple: si possible initial initial n'est pas présent puis ripper toutes les initiales de uniSelectedContacts et utiliser la jointure interne pour renvoyer toutes les correspondances par [nom], [prénom] sinon si l'initiale du milieu est présente puis l'associer uniSelectedContacts utilisant la jointure interne [nom de famille], [prénom] [initiale du milieu]. – JohnMerlino

+0

Que diriez-vous d'exécuter une "make table" pour sélectionner toutes les correspondances "faciles", suivi par quelque chose de similaire à ce qui précède, en excluant le contenu de la "make table", comme une requête Ajouter? Est-ce que ce costume? – Fionnuala

+0

Donc, s'il y a un total de 1 million d'enregistrements et si les correspondances faciles renvoient 200 enregistrements, alors la requête d'ajout doit-elle encore parcourir 999 800 enregistrements? – JohnMerlino