2010-11-19 63 views
0

在Microsoft Access中,我有一个查询uniSelectedContacts和table possibles。在MS Access中运行查询时动态解析

让我们在候选条件说我有这样的:

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

在uniSelectedContacts我有这样的:

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

我想找到其中的名和姓是可识别的。但是,由于中间初始值的变化,如果没有可能的中间初始值,那么我想使用INNER JOIN来解释uniSelectedContacts中名和姓的所有实例。如果可能的话有一个中间首字母(名字),不管它的中间首字母或名字是什么,我想要记录uniSelectedContacts和可能词的名字和姓氏彼此相同的记录,以及中间的第一个字母uniSelectedContacts的首字母(名称)与可能的中间首字母(名称)的首字母匹配。所以在上面的例子中,这应该是返回:

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

下面的查询速度快,我想保留的速度,但 将跳过上述所有记录(由于中间名首字母(名称不同) :

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; 

为了尝试解决上述问题,我有这样的:

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))); 

上面给出“输入参数值possibles.firstname”的消息,但我也没有确定查询的底层逻辑是否会传达我期待的结果。

感谢您的回复。

回答

0

从发布的示例中判断字段(列)有点困难,但我假定两个表都有surnameforename格式的全名。

我不是说这会很快,而是尝试一下。

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; 

另一种可能性:

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

感谢响应。 40分钟后,由于此查询仍在运行,我不得不强制退出应用程序。有没有任何可能的方式来做一个不超过5分钟的条件?例如:如果可能中间首字母不存在 然后从uniSelectedContacts中撕掉所有中间首字母并使用内部联接以[姓氏]返回所有匹配,[名] 否则为 如果可能中间首字母存在 然后匹配它agaisnt uniSelectedContacts使用内部连接[姓氏],[名字] [中间首字母]。 – JohnMerlino 2010-11-19 14:43:30

+0

如何运行“make table”来选择所有“easy”匹配,然后是类似于上面的内容,排除“make table”的内容作为附加查询?那会合适吗? – Fionnuala 2010-11-19 15:30:16

+0

因此,如果总共有100万条记录,并且如果简单匹配返回200条记录,那么追加查询仍然需要运行999,800条记录? – JohnMerlino 2010-11-19 15:39:12