我试图查询一个表并将结果附加到另一个表中。我试图创建的查询需要表中的两个字段:
[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天内没有在目标表中加上下一次更新日期,那么需要修改什么才能根据这两个字段追加?谢谢!
发布于 2013-11-07 15:20:49
在我看来,你可以用两种方法之一来处理这件事。您感兴趣的一组案例很容易定义。
SELECT CaseNumber, NextRenewalDate
FROM TblCaseListing
WHERE NextRenewalDate <= DateAdd("d", 90, Date())您的第一个选项是使用NOT存在来检查已插入的情况下的目标表。
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
)然而,有些人不赞成使用不存在,因为它不是很有效。
另一种选择是在tblCaseNumberQueue中创建唯一的索引。
CREATE UNIQUE INDEX UX_CaseDate ON tblCaseNumberQueue (CaseNumber, NextRenewalDate)然后,只需在不存在检查的情况下进行插入,并让唯一索引不允许已经存在的行。
INSERT INTO tblCaseNumberQueue (CaseNumber, NextRenewalDate)
SELECT CaseNumber, NextRenewalDate
FROM TblCaseListing
WHERE NextRenewalDate <= DateAdd("d", 90, Date())然而,有些人也对这种做法不以为然。他们声称,我们应该始终避免错误,而不是依靠这种机制来进行其他“合法”的行动。
就我个人而言,我可能会选择第一个选项,因为它更明确,并且只有在我认为不存在可能会对性能产生显著影响的情况下,才会选择第二个选项。(但是,我建议在这两种情况下创建唯一的索引,因为您确实希望避免重复,无论您选择哪种方式来避免它们。)
https://stackoverflow.com/questions/19837911
复制相似问题