2

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

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

本质上,此表列出了所有可能的案例,以及案例号可以最后更新的日期。我正在创建的过程如下所示:

  1. 在 NextRenewalDate (dest. [tblCaseNumberQueue]) 前 90 天查询并附加案例
  2. 案件由用户处理
  3. 如果项目完成,则 TblCaseListing.NextRenewalDate 更新为下一年

现在我的查询看起来像:

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 天内。我需要修改什么才能根据这两个字段进行附加?谢谢!

4

1 回答 1

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,因为您确实希望避免重复,无论您选择哪种方式来避免它们。)

于 2013-11-07T15:20:49.040 回答