2011-09-30 4 views
6

私は可能な限りすべての解決策をオンラインで読んでおり、毎回異なる結果を得ています。重複を削除している間にAccessで2つのテーブルをマージするにはどうすればよいですか?

私は2つのテーブルを持っています:クライアントとパトロン。それらは両方とも、LastName、FirstName、Address、City、State、およびZipの同じ構造を持ちます。顧客には108,000のエントリがあり、パトロンには42,000のエントリしかありません。私は15万のクライアントを持っていないので、それらのエントリのいくつかは、2つの間で複製されます。

私は一貫したリストが必要です。私が実行している問題は、クライアントの一部が同じアドレスに存在するため、正当なクライアントを削除するだけで重複アドレスを削除できないということです。そして、私は非常に一般的な名前を持ついくつかのクライアントを持っています、ジェーン・ドゥー、異なる住所にそれらのカップルがあるので、私は単に重複する名またはファーストネームを除外することはできません。私は単にYESに一意の値を回すのMicrosoft Access 2010

を使用しています

が支援されていません。

私はMicrosoftのヘルプファイルを精査しており、2〜168,000の結果を得ています。

どのようにして1つのリストを二重にすることなく、アルファベット順に並べたり、行単位で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

これは実際に私が私が行ったクエリを使用している同じ番号を与えました。だから私はとても幸せです!私は今同じ結果を生み出した2つの異なる方法を持っています。どうもありがとうございました! – Lantiis

2

これを行う1つの方法は、FULL OUTER JOINとCOALESCEの値を行うことです。これにより、クライアントテーブル、顧客テーブル、またはその両方にあるかどうかを知ることができます

残念ながら、AFAIKアクセスには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を同じ人とみなしてください。ただし、実際には同じ人物です!

私があなただったら、私は4つのステップを構築したい半自動化ソリューション:

  1. クエリを通じて、
  2. 表示「isDuplicate」ブール型フィールドを追加し、1つの独特のテーブルに両方のテーブルをマージするには、すべての類似した名前は、と、クエリを通じて、アドレス(可能な限り似たような)全て同様のを
  3. 表示、削除する重複をhandpickとdupllicatesをhandpick
  4. は「isDuplicateが」
  5. Trueに設定されているすべてのレコードを削除して削除します

もちろん、このメソッドは重複する名前\アドレスが限られている場合にのみ面白いです!私はあなたのろ過があなたに数百の記録を与えると思います。どのくらい時間がかかりますか? 1時間か2か?私はそれが仕事の価値があると思います!このプロセスを自動化することで、すべての重複が排除されることを確実にすることはできません。正当なクライアントが削除されていないことを確かめることもできません。このように仕事をすることで、あなたはあなたの結果を確信します。

0

私はこれを行うためのよりよい方法を探していますが、ここの答えは「難しい」と驚いていました。自動的に参加する簡単な方法はないので、Accessネイティブ関数を使用する簡単な方法があります。

クエリウィザードを使用して、「不一致」クエリを作成します。これにより、両方のテーブルではなく一方に存在する参加者のリストが作成されます(ウィザードでどちらを指定するか)。その後、それらのレコードを追加したり、新しいテーブルを作成したりすることができます。

この手順でレコードデータをブレンドする方法ははるかに複雑なのでわかりません。

+0

ようこそstackoverflowへようこそ!これは質問に対する答えではありません。あなたは新しい質問をして、代わりにこの質問を参照しますか? – MCollard

関連する問題