2010-11-19 64 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