我正在尝试查询表并将结果附加到另一个表中。我尝试创建的查询需要表中的两个字段:
[TblCaseListing]
CaseNumber (text field describing an internal case number)
NextRenewalDate (date/time field describing the next due date for renewing the case)
基本上,此表是所有可能案例的列表,以及案例编号可以续订的日期。我正在创建的过程如下:
现在我的查询如下:
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天内,则附加。我需要修改什么才能根据这两个字段进行追加?谢谢!
答案 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,因为你真的做想要避免重复,无论你选择哪种方式来避免重复。)