SQL没有产生预期的结果

时间:2010-05-27 21:01:12

标签: sql ms-access

我有三个与此特定查询相关的表:

  • Lawson_Employees:LawsonID(pk),LastNameFirstNameAccCode(数字)
  • Lawson_DeptInfo:AccCode(pk),AccCode2(不要问,HR设置),DisplayName
  • tblExpirationDates:EmpID(pk),ACLS(日期),EP(日期),CPR(日期),CPR_Imported(日期), PALS(日期),Note

目标是获取我需要报告的所有数据,这些数据已经在一个或多个认证中过期,或者将在未来90天内过期。

一些重要的注释:

  • 这是作为vbScript的一部分运行的,因此在运行脚本时会计算90天的日期。我使用2010-08-31作为占位符,因为它是在发布此问题时的结果。
  • 所有卡片在月底到期。 (这就是为什么上述日期是8月底,而不是90天)
  • 有效的EP卡取代ACLS认证,但某些员工只需要后者。 (在我回答这个问题之前,我不会担心它,但如果我能得到帮助,我会接受它)
  • CPR列包含他们与我们一起上一堂课的到期日期。 (如果他们没有带我们任何课程,则为NULL)
  • CPR_Imported列包含他们在其他位置使用的最后一个类的到期日期。 (如果他们没有把它带到其他地方,则为NULL,并且遵循以下政策)
  • CPR类之间的区别对其他报告很重要。就本报告而言,我们真正关心的是哪一个是最新的 - 或者至少是当前最新的。
  • 如果必须,我会暂时忽略ACLS和PALS,因为它不符合CPR培训,这是目前的重大问题。 (不是其他人不会,但在上次会议中没有提及......)

这是我到目前为止的查询,它给了我很好的数据:

SELECT 
    iEmp.LawsonID, iEmp.LastName, iEmp.FirstName, 
    dept.AccCode2, dept.DisplayName, 
    Exp.ACLS, Exp.EP, Exp.CPR, Exp.CPR_Imported, Exp.PALS, Exp.Note 
FROM (Lawson_Employees AS iEmp 
        LEFT JOIN Lawson_DeptInfo AS dept ON dept.AccCode = iEmp.AccCode) 
        LEFT JOIN tblExpirationDates AS Exp ON iEmp.LawsonID = Exp.EmpID 
WHERE iEmp.CurrentEmp = 1 
    AND ((Exp.ACLS <= #2010-08-31# 
            AND Exp.ACLS IS NOT NULL)
        OR (Exp.CPR <= #2010-08-31# 
            AND Exp.CPR_Imported <= #2010-08-31#) 
        OR (Exp.PALS <= #2010-08-31# 
            AND Exp.PALS IS NOT NULL))
ORDER BY dept.AccCode2, iEmp.LastName, iEmp.FirstName;

在仔细阅读结果集后,我想我错过了应该在结果集中的一些过期日期。我错过了什么吗?这是该部门唯一的开发人员的糟糕部分......没有人要求一点帮助。

1 个答案:

答案 0 :(得分:0)

我认为问题在于:

 OR (Exp.CPR <= #2010-08-31# 
            AND Exp.CPR_Imported <= #2010-08-31#) 

Null不小于或大于任何东西。

如果您需要没有有效CPR的人,则需要包含空值。

使用Nz可能最简单:

 OR (Nz(Exp.CPR,#2010-08-31#) <= #2010-08-31# 
            AND Nz(Exp.CPR_Imported,#2010-08-31#) <= #2010-08-31#)