附加到另一个表中并避免重复

时间:2013-11-07 14:02:29

标签: ms-access

我正在尝试查询表并将结果附加到另一个表中。我尝试创建的查询需要表中的两个字段:

[TblCaseListing]
CaseNumber (text field describing an internal case number)
NextRenewalDate (date/time field describing the next due date for renewing the case)

基本上,此表是所有可能案例的列表,以及案例编号可以续订的日期。我正在创建的过程如下:

  1. 在NextRenewalDate之前90天查询并附加案例(dest。[tblCaseNumberQueue])
  2. 案例由用户处理
  3. 如果项目完成,TblCaseListing.NextRenewalDate将更新到下一年
  4. 现在我的查询如下:

    Field: CaseNumber
    Criteria: Not In (SELECT DISTINCT CaseNumber FROM tblCaseNumberQueue) 'problem is here
    
    Field: NextRenewalDate
    Criteria: <=DateAdd("d",90,Date()) 'detect and append from 90 days
    

    然而,这是不正确的。由于NextRenewalDate将逐年由工作表单并更新数据的用户更改。我想在90天内追加,只要续订日期和案例编号组合在一起就不存在于目的地表中。这个查询对我说“如果今天的日期在90天内并且案例编号不在目的地表中,则附加”。它应该说“如果案例编号与下一个续订日期相结合不在目的地表中,并且NextRenewalDate在90天内,则附加。我需要修改什么才能根据这两个字段进行追加?谢谢!

1 个答案:

答案 0 :(得分:3)

在我看来,你可以通过两种方式之一来解决这个问题。您感兴趣的案例集很容易定义

SELECT CaseNumber, NextRenewalDate
FROM TblCaseListing
WHERE NextRenewalDate <= DateAdd("d", 90, Date())

您的第一个选择是使用NOT EXISTS检查目的地表中已插入的案例

INSERT INTO tblCaseNumberQueue (CaseNumber, NextRenewalDate)
SELECT CaseNumber, NextRenewalDate
FROM TblCaseListing
WHERE NextRenewalDate <= DateAdd("d", 90, Date())
    AND NOT EXISTS
        (
            SELECT * FROM tblCaseNumberQueue
            WHERE tblCaseNumberQueue.CaseNumber = TblCaseListing.CaseNumber
                AND tblCaseNumberQueue.NextRenewalDate = TblCaseListing.NextRenewalDate
        )

然而,有些人不赞成使用NOT EXISTS,因为效率不高。

另一种选择是在[tblCaseNumberQueue]中创建一个唯一索引

CREATE UNIQUE INDEX UX_CaseDate ON tblCaseNumberQueue (CaseNumber, NextRenewalDate)

然后只执行不带NOT EXISTS检查的INSERT,并让唯一索引禁止已存在的行。

INSERT INTO tblCaseNumberQueue (CaseNumber, NextRenewalDate)
SELECT CaseNumber, NextRenewalDate
FROM TblCaseListing
WHERE NextRenewalDate <= DateAdd("d", 90, Date())

然而,有些人也不赞成这种做法。他们声称我们应始终避免错误,而不是依赖此类机制进行“合法”操作。

就个人而言,我可能会选择第一个选项,因为它更明确,如果我认为NOT EXISTS可能会显着影响性能,则只选择第二个选项。 (但是,我建议在任何一种情况下创建UNIQUE INDEX,因为你真的想要避免重复,无论你选择哪种方式来避免重复。)