1

一部の連絡先に関する情報を含む 2 つのテーブルがあります。これらの連絡先が次の条件の下に存在する場合、これらの連絡先を照合するクエリをいくつか作成しようとしています。

  1. FirstName、LastName、および電子メールの一致
  2. FirstName と電子メールの一致
  3. 姓と電子メールの一致

最初の基準を取得するためのクエリを作成しましたが、これは非常に簡単です。2 番目の基準では、最初の基準から残されたデータに基づいて一致させたいと思います (2 番目のクエリに、既に存在するデータを含めたくありません)。最初の1つ)

最初のクエリにないデータを取得するためにこのクエリを書きましたが、アプリケーションが壊れました (ビジネス要件としてアクセス DB を使用しています)。

このクエリが間違っていることはわかっていますが、2 番目のクエリを解決する方法を教えてください。

SELECT DISTINCT TableA.[Contact ID], TableB.[UIR No]
FROM TableA, TableB
WHERE TableB.[UIR No] NOT IN (SELECT TableB.[UIR No] FROM TableA, TableB WHERE (((TableA.[Last Name])=TableB.[Last Name]) And ((TableA.Email)=TableB.Email) And ((TableA.[First Name])=TableB.[First Name]));)
AND
TableA.[Contact ID] NOT IN(SELECT  TableA.[Contact ID] FROM TableA, TableB WHERE (((TableA.[Last Name])=TableB.[Last Name]) And ((TableA.Email)=TableB.Email) And ((TableA.[First Name])=TableB.[First Name])););
4

3 に答える 3

2

このような場合、私はクエリを個々の「基本クエリ」に分割して保存することを好む傾向があります。次に、「基本クエリ」に基づいて「結果クエリ」を作成します。この場合、3つのマッチング方法の「基本クエリ」を作成することから始めます。

[qry_base_1_matchFirstLastEmail]:

SELECT DISTINCT TableA.[Contact ID], TableB.[UIR No]
FROM TableA INNER JOIN TableB ON (TableA.Email = TableB.Email) AND (TableA.[Last Name] = TableB.[Last Name]) AND (TableA.[First Name] = TableB.[First Name]);

[qry_base_2_matchFirstEmail]:

SELECT DISTINCT TableA.[Contact ID], TableB.[UIR No]
FROM TableA INNER JOIN TableB ON (TableA.Email = TableB.Email) AND (TableA.[First Name] = TableB.[First Name]);

[qry_base_3_matchLastEmail]:

SELECT DISTINCT TableA.[Contact ID], TableB.[UIR No]
FROM TableA INNER JOIN TableB ON (TableA.[Last Name] = TableB.[Last Name]) AND (TableA.Email = TableB.Email);

次に、これらを「結果クエリ」のソースとして使用できます。ここで、ステップ(2)はステップ(1)の結果を省略し、ステップ(3)は(2)と(1)の両方の結果を省略します。

ステップ1:[名]、[姓]、[メール]を照合します

これはすでに「基本クエリ」の1つとして使用されているため、単に名前qry_base_1_matchFirstLastEmailを変更するqry_result_1_matchOnlyFirstLastEmailか(混乱を招く可能性があります)、qry_result_1_matchOnlyFirstLastEmail結果を返すだけの新しいものを作成するかqry_base_1_matchFirstLastEmail(少し非効率的です)を選択する必要があります。混乱しやすいので、2番目のオプションを選択します

[qry_result_1_matchOnlyFirstLastEmail]:

SELECT qry_base_1_matchFirstLastEmail.*
FROM qry_base_1_matchFirstLastEmail;

ステップ2: [名]と[メール]だけを一致させる

ステップ1ですでに特定した結果を取得してqry_base_2_matchFirstEmail削除します。

[qry_result_2_matchOnlyFirstEmail]:

SELECT qry_base_2_matchFirstEmail.[Contact ID], qry_base_2_matchFirstEmail.[UIR No]
FROM qry_base_2_matchFirstEmail LEFT JOIN qry_base_1_matchFirstLastEmail ON (qry_base_2_matchFirstEmail.[UIR No] = qry_base_1_matchFirstLastEmail.[UIR No]) AND (qry_base_2_matchFirstEmail.[Contact ID] = qry_base_1_matchFirstLastEmail.[Contact ID])
WHERE (((qry_base_1_matchFirstLastEmail.[Contact ID]) Is Null) AND ((qry_base_1_matchFirstLastEmail.[UIR No]) Is Null));

ステップ3: [名前]と[メール]だけを一致させる

手順1と2ですでに特定した結果を取得しqry_base_3_matchLastEmail、削除します。

[qry_result_3_matchOnlyLastEmail]:

SELECT qry_base_3_matchLastEmail.[Contact ID], qry_base_3_matchLastEmail.[UIR No]
FROM (qry_base_3_matchLastEmail LEFT JOIN qry_base_2_matchFirstEmail ON (qry_base_3_matchLastEmail.[UIR No] = qry_base_2_matchFirstEmail.[UIR No]) AND (qry_base_3_matchLastEmail.[Contact ID] = qry_base_2_matchFirstEmail.[Contact ID])) LEFT JOIN qry_base_1_matchFirstLastEmail ON (qry_base_3_matchLastEmail.[UIR No] = qry_base_1_matchFirstLastEmail.[UIR No]) AND (qry_base_3_matchLastEmail.[Contact ID] = qry_base_1_matchFirstLastEmail.[Contact ID])
WHERE (((qry_base_2_matchFirstEmail.[Contact ID]) Is Null) AND ((qry_base_2_matchFirstEmail.[UIR No]) Is Null) AND ((qry_base_1_matchFirstLastEmail.[Contact ID]) Is Null) AND ((qry_base_1_matchFirstLastEmail.[UIR No]) Is Null));

(最後のものは少し怖いように見えるかもしれませんが、SQLをAccessクエリデザイナに貼り付けると、それが本当に恐れることは何もないことがわかります。)

于 2013-03-15T15:30:35.200 に答える
1

私はそれを本当に簡単な方法で解決し、前の答えと同じ結果を私に与えました

クエリ1の場合:使用しました

SELECT TableA.[First Name], TableB.[First Name], TableB.[Last Name], TableA.[Last Name], TableA.Email, TableB.Email, TableA.[Contact ID], TableB.[UIR No], TableB.[Ver No]
FROM TableA, TableB
WHERE (((TableA.[First Name])=TableB.[First Name]) And ((TableA.[Last Name])=TableB.[Last Name]) And ((TableA.Email)=TableB.Email));

クエリ2の場合:使用しました

SELECT TableA.[Last Name], TableB.[Last Name], TableB.Email, TableA.Email, TableA.[First Name], TableB.[First Name], TableA.[Contact ID], TableB.[UIR No], TableB.[Ver No]
FROM TableA, TableB
WHERE (((TableA.[Last Name])=TableB.[Last Name]) And ((TableA.Email)=TableB.Email) And ((TableA.[First Name])<>TableB.[First Name]));

クエリ3の場合:使用しました

SELECT TableA.[First Name], TableB.[First Name], TableB.[Last Name], TableA.[Last Name], TableA.Email, TableB.Email, TableA.[Contact ID], TableB.[UIR No], TableB.[Ver No]
FROM TableA, TableB
WHERE (((TableA.[First Name])=TableB.[First Name]) And ((TableA.[Last Name])<>TableB.[Last Name]) And ((TableA.Email)=TableB.Email));
于 2013-03-15T20:02:39.143 に答える
0

参加する方が良いかもしれません。

SELECT DISTINCT TableA.[Contact ID], TableB.[UIR No]
FROM TableA
INNER JOIN TableB
ON TableA.FirstName=Tableb.FirstName 
AND TableA.Email=Tableb.Email
WHERE TableB.[UIR No] NOT IN 
   (SELECT TableB.[UIR No]
    FROM TableA
    INNER JOIN TableB
    ON TableA.FirstName=Tableb.FirstName 
    AND TableA.LastName=Tableb.LastName 
    AND TableA.Email=Tableb.Email);

INNER JOINには、両方のテーブルで一致するレコードのみが含まれることに注意してください。

于 2013-03-15T14:10:27.693 に答える