2011-09-30 91 views
6

我已經通過在線閱讀了所有可能的解決方案,並且每次都得到不同的結果。如何在刪除重複項的同時在Access中合併兩個表?

我有兩個表:客戶和老主顧。它們都具有相同的結構:姓氏,名字,地址,城市,州和郵編。客戶有108,000個條目,而贊助人只有42,000個條目。其中一些條目在兩者之間重複,因爲我沒有150,000個客戶端。

我需要一個一致的列表。我遇到的問題是,我的一些客戶端位於相同的地址,因此我不能簡單地刪除重複的地址,因爲這會刪除合法的客戶端。我有一些名字很普通的客戶,比如說Jane Doe,他們在不同的地址有幾個客戶,所以我不能只過濾掉重複的姓或名。

我使用的是Microsoft Access 2010中

只需爲YES轉向唯一值是沒有幫助。

我已經走遍了微軟的幫助文件,我已經得到之間的2結果168,000和大多數的一切。

我怎樣才能不重複的一個列表,而不必按字母順序排列,然後轉到逐行150,000項?

+0

我們的業務成立的方式,有些是客戶和老主顧,而大多數人只是一個或另一個。 – Lantiis

回答

8

UNION查詢只返回不同的行。 (還有UNION ALL,但將包括重複行,所以你不想在這裏。)

嘗試此查詢。如果它沒有返回你想要的,請解釋爲什麼如果短缺。

SELECT LastName, FirstName, Address, City, State, Zip 
FROM Clients 
UNION 
SELECT LastName, FirstName, Address, City, State, Zip 
FROM Patrons 
ORDER BY LastName, FirstName; 

您可能需要ORDER BY中的其他字段。我剛剛提供了一些開始。要做到這一點

+0

這實際上給了我使用查詢查詢的相同數字。所以我很開心!我有兩種不同的方法可以產生相同的結果。非常感謝你! – Lantiis

2

一種方法是做一個FULL OUTER JOIN和聚結值。這將讓你知道,如果它在客戶端表,顧客表或兩者

不幸的是AFAIK Access沒有FULL OUTER,所以你需要模擬它來代替。

SELECT a.LastName, a.FirstName, a.Address, a.City, a.State, a.Zip , "Both" as type 
FROM Clients a INNER JOIN Patrons b 
ON a.LastName = b.LastName 
    AND a.Address = b.Address 
    AND a.City = b.City 
    AND a.State = b.State 
    AND a.Zip = b.Zip 
UNION ALL 
SELECT a.LastName, a.FirstName, a.Address, a.City, a.State, a.Zip , "Client" as type 
FROM Clients a LEFT JOIN Patrons b 
ON a.LastName = b.LastName 
    AND a.Address = b.Address 
    AND a.City = b.City 
    AND a.State = b.State 
    AND a.Zip = b.Zip 
WHERE 
    b.PatronID is null (Or whatever the PK is) 
UNION ALL 
SELECT b.LastName, b.FirstName, b.Address, b.City, b.State, b.Zip , "Patron" as type 
FROM Clients a RIGHT JOIN Patrons b 
ON a.LastName = b.LastName 
    AND a.Address = b.Address 
    AND a.City = b.City 
    AND a.State = b.State 
    AND a.Zip = b.Zip 
WHERE 
    a.ClientID is null (Or whatever the PK is) 

如果你只需要一個列表但你應該只使用HansUp的回答

+0

我希望我有足夠的代表碰到這個。我喜歡玩這個雖然最後我只需要一個列表^^ – Lantiis

0

我不知道,建立一個完全自動化的解決方案是值得的工作:你將永遠無法建立一個代碼,將考慮Doe, Jane, 1234 Sunset BoulevardDoe, Jane, 1234 Sunset Bd作爲同一個人,雖然這些是真正的同一個人!

如果我是你,我會建一個四步半自動化的解決方案:

  1. 合併成爲一個獨特的表兩張表,添加一個「isDuplicate」布爾場
  2. 顯示,通過查詢,所有類似的名字,並精選複製到被刪除
  3. 顯示,通過查詢,所有類似(儘可能相似)地址和精選dupllicates被刪除
  4. 刪除其中「isDuplicate」設置爲True
  5. 所有記錄

當然,這種方法只有在重複名稱\地址有限的情況下才有意義!我想你的過濾器會給你幾百條記錄來考慮。這需要多長時間?一個小時或兩個?我認爲這是值得的工作!通過自動執行此過程,您將永遠無法確保刪除所有重複項,也不會確保沒有合法客戶被刪除。通過這樣的工作,你會確信你的結果。

0

我正在尋找更好的方法來做到這一點,但我很驚訝,這裏的答案是一種「困難」。鑑於沒有簡單的方法來自動連接,使用Access本地函數有一個簡單的方法。

使用查詢嚮導創建「不匹配」查詢。這將創建一個存在於一個(但不是兩個表)上的參與者列表(您在嚮導期間指定哪個參與者)。然後你可以附加這些記錄或創建一個新的表格。

我不知道在這一步混合記錄數據的方式,因爲這更復雜。

+0

歡迎來到stackoverflow!這不是對這個問題的回答,你想提出一個新問題,而是參考這個問題。 – MCollard

相關問題