获取未完成查询的数据

时间:2013-03-15 13:58:44

标签: database ms-access ms-access-2007

我有两个表格,其中包含有关某些联系人的信息,我正在尝试构建一些查询,以便在符合以下条件的情况下将这些联系人匹配在一起:

  1. 匹配FirstName,LastName和电子邮件
  2. 匹配FirstName和电子邮件
  3. 匹配姓氏和电子邮件
  4. 我构建了一个查询以获得非常简单的第一个条件,现在我想根据第一个条件留下的数据匹配第二个条件(我不希望第二个查询包含数据,已经是第一个了)

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

    我知道这个查询有误,但是请你帮我或指导我如何解决第二个问题。

    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])););
    

3 个答案:

答案 0 :(得分: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)的结果: / p>

第1步:匹配[名字],[姓氏]和[电子邮件]

我们已将其作为我们的“基本查询”之一,因此我们必须在简单地将qry_base_1_matchFirstLastEmail重命名为qry_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步:匹配只是 [名字]和[电子邮件]

我们希望从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查询设计器中,你会发现它真的没什么好害怕的。)

答案 1 :(得分:1)

我以一种非常简单的方式解决了它,给了我与之前的answer

相同的结果

对于查询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));

答案 2 :(得分: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仅包含两个表中匹配的记录。