在MS Access中运行查询时动态解析

时间:2010-11-19 02:48:34

标签: parsing ms-access join

在Microsoft Access中,我有一个查询uniSelectedContacts和表可能。

让我说有可能我有这个:

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的initial(name)匹配可能的中间首字母(名称)的第一个字母。所以在上面的例子中,应该返回:

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”消息。但我也不确定查询的基础逻辑是否会提供我期望的结果。

感谢您的回复。

1 个答案:

答案 0 :(得分: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 & "*"