1

我有两个表,其中包含有关某些联系人的信息,如果它们在以下条件下存在,我正在尝试构建一些查询以将这些联系人匹配在一起:

  1. 匹配名字、姓氏和电子邮件
  2. 匹配名字和电子邮件
  3. 匹配姓氏和电子邮件

我构建了一个查询来获取第一个非常简单的条件,现在对于第二个条件,我希望根据第一个条件留下的数据进行匹配(我不希望第二个查询包含已经存在的数据第一个)

我编写了这个查询来获取不在第一个查询中但它破坏了应用程序的数据(我使用访问数据库作为业务需求)

我知道这个查询是错误的,但请您帮助我或指导我如何解决第二个查询。

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

在这种情况下,我倾向于将查询分解为单独的“基本查询”并保存它们。然后我根据“基本查询”创建“结果查询”。在这种情况下,我将首先为三种匹配方式创建“基本查询”:

[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 步:匹配 [First Name]、[Last Name] 和 [Email]

我们已经将它作为我们的“基本查询”之一,因此我们必须在简单地重命名qry_base_1_matchFirstLastEmailqry_result_1_matchOnlyFirstLastEmail(这可能会令人困惑)或创建一个qry_result_1_matchOnlyFirstLastEmail简单地从其返回结果qry_base_1_matchFirstLastEmail(这有点低效)之间做出选择。我很容易混淆,所以我会选择第二个选项

[qry_result_1_matchOnlyFirstLastEmail]:

SELECT qry_base_1_matchFirstLastEmail.*
FROM qry_base_1_matchFirstLastEmail;

第 2 步:仅匹配[First Name] 和 [Email]

我们希望从qry_base_2_matchFirstEmail步骤 1 中已经确定的结果中提取并消除结果:

[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 步:仅匹配[姓氏] 和 [电子邮件]

我们希望从qry_base_3_matchLastEmail步骤 1 和步骤 2 中已经确定的结果中提取并消除结果:

[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 回答